Deploy app and fix bug in UserAccount regarding FriendList comp

This commit is contained in:
Alex Erdei 2025-05-08 14:27:54 +01:00
parent 9d109e6302
commit 4b8b7d55bf
18 changed files with 1344 additions and 645 deletions

View File

@ -1,10 +1,40 @@
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Preact</title> <title>fakebook-aigen</title>
<!-- Start Single Page Apps for GitHub Pages -->
<script type="text/javascript">
// Single Page Apps for GitHub Pages
// MIT License
// https://github.com/rafgraph/spa-github-pages
// This script checks to see if a redirect is present in the query string,
// converts it back into the correct url and adds it to the
// browser's history using window.history.replaceState(...),
// which won't cause the browser to attempt to load the new url.
// When the single page app is loaded further down in this file,
// the correct url will be waiting in the browser's history for
// the single page app to route accordingly.
(function (l) {
if (l.search[1] === "/") {
var decoded = l.search
.slice(1)
.split("&")
.map(function (s) {
return s.replace(/~and~/g, "&");
})
.join("?");
window.history.replaceState(
null,
null,
l.pathname.slice(0, -1) + decoded + l.hash
);
}
})(window.location);
</script>
<!-- End Single Page Apps for GitHub Pages -->
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>

616
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "fakebook-ainiro", "name": "fakebook-ainiro",
"version": "0.0.0", "version": "0.1.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "fakebook-ainiro", "name": "fakebook-ainiro",
"version": "0.0.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@microsoft/signalr": "^8.0.7", "@microsoft/signalr": "^8.0.7",
"@reduxjs/toolkit": "^1.8.3", "@reduxjs/toolkit": "^1.8.3",
@ -17,11 +17,11 @@
"react-icons": "^4.2.0", "react-icons": "^4.2.0",
"react-player": "^2.12.0", "react-player": "^2.12.0",
"react-redux": "^8.0.2", "react-redux": "^8.0.2",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0"
"signalr": "^2.4.3"
}, },
"devDependencies": { "devDependencies": {
"@preact/preset-vite": "^2.9.3", "@preact/preset-vite": "^2.9.3",
"gh-pages": "^6.3.0",
"vite": "^6.0.5" "vite": "^6.0.5"
} }
}, },
@ -847,6 +847,44 @@
"ws": "^7.4.5" "ws": "^7.4.5"
} }
}, },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@popperjs/core": { "node_modules/@popperjs/core": {
"version": "2.11.8", "version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@ -1333,6 +1371,23 @@
"node": ">=6.5" "node": ">=6.5"
} }
}, },
"node_modules/array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"dev": true,
"license": "MIT"
},
"node_modules/babel-plugin-transform-hook-names": { "node_modules/babel-plugin-transform-hook-names": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz",
@ -1370,6 +1425,19 @@
"popper.js": "^1.16.1" "popper.js": "^1.16.1"
} }
}, },
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/browserslist": { "node_modules/browserslist": {
"version": "4.24.4", "version": "4.24.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
@ -1430,6 +1498,23 @@
"integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/commander": {
"version": "13.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
"integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true,
"license": "MIT"
},
"node_modules/convert-source-map": { "node_modules/convert-source-map": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@ -1509,6 +1594,19 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/dom-helpers": { "node_modules/dom-helpers": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
@ -1585,6 +1683,13 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/email-addresses": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
"integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==",
"dev": true,
"license": "MIT"
},
"node_modules/entities": { "node_modules/entities": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@ -1649,6 +1754,16 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/estree-walker": { "node_modules/estree-walker": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@ -1674,6 +1789,33 @@
"node": ">=12.0.0" "node": ">=12.0.0"
} }
}, },
"node_modules/fast-glob": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.8"
},
"engines": {
"node": ">=8.6.0"
}
},
"node_modules/fastq": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
}
},
"node_modules/fetch-cookie": { "node_modules/fetch-cookie": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz", "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz",
@ -1684,6 +1826,104 @@
"tough-cookie": "^4.0.0" "tough-cookie": "^4.0.0"
} }
}, },
"node_modules/filename-reserved-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
"integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/filenamify": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
"integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
"dev": true,
"license": "MIT",
"dependencies": {
"filename-reserved-regex": "^2.0.0",
"strip-outer": "^1.0.1",
"trim-repeated": "^1.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/find-cache-dir": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
"integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
"dev": true,
"license": "MIT",
"dependencies": {
"commondir": "^1.0.1",
"make-dir": "^3.0.2",
"pkg-dir": "^4.1.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/avajs/find-cache-dir?sponsor=1"
}
},
"node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fs-extra": {
"version": "11.3.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
"integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/fs-extra/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/fsevents": { "node_modules/fsevents": {
"version": "2.3.3", "version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@ -1709,6 +1949,42 @@
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/gh-pages": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.3.0.tgz",
"integrity": "sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==",
"dev": true,
"license": "MIT",
"dependencies": {
"async": "^3.2.4",
"commander": "^13.0.0",
"email-addresses": "^5.0.0",
"filenamify": "^4.3.0",
"find-cache-dir": "^3.3.1",
"fs-extra": "^11.1.1",
"globby": "^11.1.0"
},
"bin": {
"gh-pages": "bin/gh-pages.js",
"gh-pages-clean": "bin/gh-pages-clean.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/globals": { "node_modules/globals": {
"version": "11.12.0", "version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@ -1719,6 +1995,34 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.2.9",
"ignore": "^5.2.0",
"merge2": "^1.4.1",
"slash": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true,
"license": "ISC"
},
"node_modules/he": { "node_modules/he": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@ -1752,6 +2056,16 @@
"react-is": "^16.7.0" "react-is": "^16.7.0"
} }
}, },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/immer": { "node_modules/immer": {
"version": "9.0.21", "version": "9.0.21",
"resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
@ -1771,6 +2085,39 @@
"loose-envify": "^1.0.0" "loose-envify": "^1.0.0"
} }
}, },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/isarray": { "node_modules/isarray": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
@ -1781,7 +2128,8 @@
"version": "3.7.1", "version": "3.7.1",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
"integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
"license": "MIT" "license": "MIT",
"peer": true
}, },
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
@ -1815,6 +2163,29 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/jsonfile/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/kolorist": { "node_modules/kolorist": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
@ -1828,6 +2199,19 @@
"integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==", "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/loose-envify": { "node_modules/loose-envify": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@ -1863,12 +2247,52 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"license": "MIT",
"dependencies": {
"semver": "^6.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/memoize-one": { "node_modules/memoize-one": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
}
},
"node_modules/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/ms": { "node_modules/ms": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@ -1955,6 +2379,55 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/path-to-regexp": { "node_modules/path-to-regexp": {
"version": "1.9.0", "version": "1.9.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
@ -1964,6 +2437,16 @@
"isarray": "0.0.1" "isarray": "0.0.1"
} }
}, },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@ -1984,6 +2467,19 @@
"url": "https://github.com/sponsors/jonschlinkert" "url": "https://github.com/sponsors/jonschlinkert"
} }
}, },
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"find-up": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/popper.js": { "node_modules/popper.js": {
"version": "1.16.1", "version": "1.16.1",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
@ -2086,6 +2582,27 @@
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/react": { "node_modules/react": {
"version": "17.0.2", "version": "17.0.2",
"resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
@ -2347,6 +2864,17 @@
"integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/reusify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
"license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
"node_modules/rollup": { "node_modules/rollup": {
"version": "4.30.1", "version": "4.30.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz",
@ -2386,6 +2914,30 @@
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
} }
}, },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/scheduler": { "node_modules/scheduler": {
"version": "0.20.2", "version": "0.20.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
@ -2412,13 +2964,14 @@
"integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/signalr": { "node_modules/slash": {
"version": "2.4.3", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/signalr/-/signalr-2.4.3.tgz", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-RbBKFVCZvDgyyxZDeu6Yck9T+diZO07GB0bDiKondUhBY1H8JRQSOq8R0pLkf47ddllQAssYlp7ckQAeom24mw==", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"license": "Apache-2.0", "dev": true,
"dependencies": { "license": "MIT",
"jquery": ">=1.6.4" "engines": {
"node": ">=8"
} }
}, },
"node_modules/source-map": { "node_modules/source-map": {
@ -2451,6 +3004,19 @@
"node": ">=16" "node": ">=16"
} }
}, },
"node_modules/strip-outer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
"integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
"dev": true,
"license": "MIT",
"dependencies": {
"escape-string-regexp": "^1.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/tiny-invariant": { "node_modules/tiny-invariant": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
@ -2463,6 +3029,19 @@
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/tough-cookie": { "node_modules/tough-cookie": {
"version": "4.1.4", "version": "4.1.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
@ -2484,6 +3063,19 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/trim-repeated": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
"integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
"dev": true,
"license": "MIT",
"dependencies": {
"escape-string-regexp": "^1.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/uncontrollable": { "node_modules/uncontrollable": {
"version": "7.2.1", "version": "7.2.1",
"resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz",

View File

@ -1,12 +1,15 @@
{ {
"name": "fakebook-ainiro", "name": "fakebook-ainiro",
"private": true, "private": true,
"version": "0.0.0", "version": "0.1.0",
"homepage": "https://alexerdei73.github.io/fakebook-aigen",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
"preview": "vite preview" "preview": "vite preview",
"predeploy": "npm run build",
"deploy": "gh-pages -d dist"
}, },
"dependencies": { "dependencies": {
"@microsoft/signalr": "^8.0.7", "@microsoft/signalr": "^8.0.7",
@ -18,11 +21,11 @@
"react-icons": "^4.2.0", "react-icons": "^4.2.0",
"react-player": "^2.12.0", "react-player": "^2.12.0",
"react-redux": "^8.0.2", "react-redux": "^8.0.2",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0"
"signalr": "^2.4.3"
}, },
"devDependencies": { "devDependencies": {
"@preact/preset-vite": "^2.9.3", "@preact/preset-vite": "^2.9.3",
"gh-pages": "^6.3.0",
"vite": "^6.0.5" "vite": "^6.0.5"
} }
} }

50
public/404.html Normal file
View File

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>fakebook-aigen</title>
<script type="text/javascript">
// Single Page Apps for GitHub Pages
// MIT License
// https://github.com/rafgraph/spa-github-pages
// This script takes the current url and converts the path and query
// string into just a query string, and then redirects the browser
// to the new url with only a query string and hash fragment,
// e.g. https://www.foo.tld/one/two?a=b&c=d#qwe, becomes
// https://www.foo.tld/?/one/two&a=b~and~c=d#qwe
// Note: this 404.html file must be at least 512 bytes for it to work
// with Internet Explorer (it is currently > 512 bytes)
// If you're creating a Project Pages site and NOT using a custom domain,
// then set pathSegmentsToKeep to 1 (enterprise users may need to set it to > 1).
// This way the code will only replace the route part of the path, and not
// the real directory in which the app resides, for example:
// https://username.github.io/repo-name/one/two?a=b&c=d#qwe becomes
// https://username.github.io/repo-name/?/one/two&a=b~and~c=d#qwe
// Otherwise, leave pathSegmentsToKeep as 0.
var pathSegmentsToKeep = 1;
var l = window.location;
l.replace(
l.protocol +
"//" +
l.hostname +
(l.port ? ":" + l.port : "") +
l.pathname
.split("/")
.slice(0, 1 + pathSegmentsToKeep)
.join("/") +
"/?/" +
l.pathname
.slice(1)
.split("/")
.slice(pathSegmentsToKeep)
.join("/")
.replace(/&/g, "~and~") +
(l.search ? "&" + l.search.slice(1).replace(/&/g, "~and~") : "") +
l.hash
);
</script>
</head>
<body></body>
</html>

View File

@ -43,10 +43,12 @@ function App() {
const firstName = name.join(" "); const firstName = name.join(" ");
const profileLink = `/fakebook/${lastName}.${firstName}`; const profileLink = `/${lastName}.${firstName}`;
useEffect(
useEffect(() => dispatch(profileLinkSet(profileLink)), [profileLink, dispatch]); () => dispatch(profileLinkSet(profileLink)),
[profileLink, dispatch]
);
//handling the password reminder button //handling the password reminder button
const [isModalSignup, setModalSignup] = useState(true); const [isModalSignup, setModalSignup] = useState(true);
@ -65,15 +67,16 @@ function App() {
else return <></>; else return <></>;
} else { } else {
return ( return (
<Col className="bg-200 vh-100"> <Col className='bg-200 vh-100'>
<Row className="h-100 align-items-center"> <Row className='h-100 align-items-center'>
<Col <Col
lg={{ span: 5, offset: 1 }} lg={{ span: 5, offset: 1 }}
className="d-flex justify-content-center"> className='d-flex justify-content-center'
>
<RecentLogins /> <RecentLogins />
</Col> </Col>
<Col lg={5} className="bg-200 d-flex justify-content-center"> <Col lg={5} className='bg-200 d-flex justify-content-center'>
<div className="login p-3 bg-light"> <div className='login p-3 bg-light'>
<Login <Login
onClickForgottenPswd={handleClickPasswordReminderBtn} onClickForgottenPswd={handleClickPasswordReminderBtn}
></Login> ></Login>
@ -81,10 +84,11 @@ function App() {
<hr /> <hr />
<Button <Button
variant="success" variant='success'
size="lg" size='lg'
className="d-block w-60 mx-auto mt-4" className='d-block w-60 mx-auto mt-4'
onClick={handleShow}> onClick={handleShow}
>
<b>Create New Account</b> <b>Create New Account</b>
</Button> </Button>
</div> </div>
@ -93,7 +97,8 @@ function App() {
<SignupModal <SignupModal
show={show && isModalSignup} show={show && isModalSignup}
onHide={handleCloseCallback} onHide={handleCloseCallback}
onExit={() => setModalSignup(true)}></SignupModal> onExit={() => setModalSignup(true)}
></SignupModal>
<PasswordReminderModal <PasswordReminderModal
show={show && !isModalSignup} show={show && !isModalSignup}

View File

@ -17,50 +17,50 @@ const FriendCard = (props) => {
function handleClick() { function handleClick() {
history.push( history.push(
user.index && user.index > 0 user.index && user.index > 0
? `/fakebook/${user.lastname}.${user.firstname}.${user.index}` ? `/${user.lastname}.${user.firstname}.${user.index}`
: `/fakebook/${user.lastname}.${user.firstname}` : `/${user.lastname}.${user.firstname}`
); );
} }
return ( return (
<Col xs={6} className="my-3"> <Col xs={6} className='my-3'>
<OverlayTrigger <OverlayTrigger
placement="auto" placement='auto'
show={showOverlay} show={showOverlay}
overlay={ overlay={
<div <div
className="popup-card" className='popup-card'
onMouseEnter={() => setShowOverlay(true)} onMouseEnter={() => setShowOverlay(true)}
onMouseLeave={() => setShowOverlay(false)} onMouseLeave={() => setShowOverlay(false)}
onClick={handleClick} onClick={handleClick}
> >
<div className="m-3"> <div className='m-3'>
<CircularImage size="120" url={user.profilePictureURL} /> <CircularImage size='120' url={user.profilePictureURL} />
</div> </div>
<h4 className="name-tag"> <h4 className='name-tag'>
<b>{userName}</b> <b>{userName}</b>
</h4> </h4>
</div> </div>
} }
> >
<button <button
type="button" type='button'
onClick={handleClick} onClick={handleClick}
className="friend-btn" className='friend-btn'
tabIndex="-1" tabIndex='-1'
> >
<StorageImage <StorageImage
storagePath={user.profilePictureURL} storagePath={user.profilePictureURL}
width="90px" width='90px'
height="90px" height='90px'
alt="" alt=''
className="profile-picture" className='profile-picture'
onMouseEnter={() => setShowOverlay(true)} onMouseEnter={() => setShowOverlay(true)}
onMouseLeave={() => setShowOverlay(false)} onMouseLeave={() => setShowOverlay(false)}
/> />
</button> </button>
</OverlayTrigger> </OverlayTrigger>
<button type="button" className="ml-3 friend-btn" onClick={handleClick}> <button type='button' className='ml-3 friend-btn' onClick={handleClick}>
<b>{userName}</b> <b>{userName}</b>
</button> </button>
</Col> </Col>

View File

@ -16,10 +16,10 @@ const FriendList = (props) => {
const isModal = variant === "modal"; const isModal = variant === "modal";
return ( return (
<Col xs="auto" className="overflow-auto mh-100"> <Col xs='auto' className='overflow-auto mh-100'>
<div id="col-1" className="m-2"> <div id='col-1' className='m-2'>
{usersToUse.map((user, index) => { {usersToUse.map((user, index) => {
let profileLink = `/fakebook/${user.lastname}.${user.firstname}`; let profileLink = `/${user.lastname}.${user.firstname}`;
if (user.index && user.index > 0) if (user.index && user.index > 0)
profileLink = profileLink + `.${user.index}`; profileLink = profileLink + `.${user.index}`;
return ( return (
@ -30,10 +30,10 @@ const FriendList = (props) => {
> >
<ProfileLink <ProfileLink
user={user} user={user}
fullname="true" fullname='true'
size={isModal ? "40" : "60"} size={isModal ? "40" : "60"}
bold="true" bold='true'
className="pb-1" className='pb-1'
/> />
</Link> </Link>
); );

View File

@ -8,9 +8,8 @@ import imgFriends from "../images/friends.jpg";
import { useDispatch } from "react-redux"; import { useDispatch } from "react-redux";
import { linkUpdated } from "../features/link/linkSlice"; import { linkUpdated } from "../features/link/linkSlice";
const FriendsListPage = (props) => { const FriendsListPage = () => {
const FRIENDS_LIST_PAGE_PATH = "/friends/list";
const FRIENDS_LIST_PAGE_PATH = "/fakebook/friends/list";
const location = useLocation(); const location = useLocation();
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -23,23 +22,23 @@ const FriendsListPage = (props) => {
}, [dispatch]); }, [dispatch]);
return window.innerWidth > 600 || isNoUser ? ( return window.innerWidth > 600 || isNoUser ? (
<Row className="overflow-hidden friends-list"> <Row className='overflow-hidden friends-list'>
<FriendList /> <FriendList />
<Col className="overflow-auto mh-100 hide-scrollbar col-two"> <Col className='overflow-auto mh-100 hide-scrollbar col-two'>
{isNoUser ? ( {isNoUser ? (
<div className="h-100 w-100 d-flex flex-column align-items-center justify-content-center"> <div className='h-100 w-100 d-flex flex-column align-items-center justify-content-center'>
<img <img
width="200px" width='200px'
src={imgFriends} src={imgFriends}
alt="cartoon of fakebook friends" alt='cartoon of fakebook friends'
className="p-4" className='p-4'
/> />
<h5 className="text-muted"> <h5 className='text-muted'>
<b>Select people's names to preview their profile.</b> <b>Select people's names to preview their profile.</b>
</h5> </h5>
</div> </div>
) : ( ) : (
<div className="profile-container"> <div className='profile-container'>
<Profile /> <Profile />
</div> </div>
)} )}

View File

@ -11,26 +11,26 @@ const LeftNavbar = (props) => {
const user = useSelector((state) => state.currentUser); const user = useSelector((state) => state.currentUser);
return ( return (
<Nav className="flex-column mt-3" id="left-navbar"> <Nav className='flex-column mt-3' id='left-navbar'>
<div className="navitem"> <div className='navitem'>
<Nav.Link <Nav.Link
as={Link} as={Link}
to={props.profileLink} to={props.profileLink}
className="text-dark flex-column justify-content-center" className='text-dark flex-column justify-content-center'
> >
<ProfileLink user={user} size="26" fullname="true" /> <ProfileLink user={user} size='26' fullname='true' />
</Nav.Link> </Nav.Link>
</div> </div>
<div className="navitem"> <div className='navitem'>
<Nav.Link as={Link} to="/fakebook/friends/list" className="text-dark"> <Nav.Link as={Link} to='/friends/list' className='text-dark'>
<FaUserFriends size="26px" className="text-info mr-2" /> <FaUserFriends size='26px' className='text-info mr-2' />
<div className="d-inline">Friends</div> <div className='d-inline'>Friends</div>
</Nav.Link> </Nav.Link>
</div> </div>
<div className="navitem"> <div className='navitem'>
<Nav.Link as={Link} to="/fakebook/watch" className="text-dark"> <Nav.Link as={Link} to='/watch' className='text-dark'>
<MdOndemandVideo size="26px" className="text-info mr-2" /> <MdOndemandVideo size='26px' className='text-info mr-2' />
<div className="d-inline">Watch</div> <div className='d-inline'>Watch</div>
</Nav.Link> </Nav.Link>
</div> </div>
</Nav> </Nav>

View File

@ -16,8 +16,8 @@ const MiniFriends = (props) => {
const friendsLink = const friendsLink =
user.index && user.index > 0 user.index && user.index > 0
? `/fakebook/${user.lastname}.${user.firstname}.${user.index}/Friends` ? `/${user.lastname}.${user.firstname}.${user.index}/Friends`
: `/fakebook/${user.lastname}.${user.firstname}/Friends`; : `/${user.lastname}.${user.firstname}/Friends`;
function handleClick() { function handleClick() {
handleClickLink( handleClickLink(
@ -33,19 +33,19 @@ const MiniFriends = (props) => {
<Card {...rest}> <Card {...rest}>
<Card.Body> <Card.Body>
<Card.Title> <Card.Title>
<Link to={friendsLink} className="text-body" onClick={handleClick}> <Link to={friendsLink} className='text-body' onClick={handleClick}>
<b>Friends</b> <b>Friends</b>
</Link> </Link>
</Card.Title> </Card.Title>
<Card.Subtitle className="text-muted"> <Card.Subtitle className='text-muted'>
{users.length} friends {users.length} friends
</Card.Subtitle> </Card.Subtitle>
<Row> <Row>
{users.map((user, index) => { {users.map((user, index) => {
const userProfileURL = const userProfileURL =
user.index && user.index > 0 user.index && user.index > 0
? `/fakebook/${user.lastname}.${user.firstname}.${user.index}` ? `/${user.lastname}.${user.firstname}.${user.index}`
: `/fakebook/${user.lastname}.${user.firstname}`; : `/${user.lastname}.${user.firstname}`;
const userName = `${user.firstname} ${user.lastname}`; const userName = `${user.firstname} ${user.lastname}`;
return ( return (
//we render maximum 9 friends //we render maximum 9 friends
@ -53,24 +53,26 @@ const MiniFriends = (props) => {
<Col <Col
key={index} key={index}
xs={4} xs={4}
className="m-0" className='m-0'
style={{ style={{
paddingLeft: "3px", paddingLeft: "3px",
paddingRight: "3px", paddingRight: "3px",
paddingTop: "0", paddingTop: "0",
paddingBottom: "3px", paddingBottom: "3px",
}}> }}
>
<ResponsiveImage <ResponsiveImage
photo={user.profilePictureURL} photo={user.profilePictureURL}
width="100%" width='100%'
height="100%" height='100%'
useStoragePath="true" useStoragePath='true'
/> />
<Link <Link
to={userProfileURL} to={userProfileURL}
className="text-body" className='text-body'
onClick={handleClick}> onClick={handleClick}
<div className="w-100" style={{ height: "2.5em" }}> >
<div className='w-100' style={{ height: "2.5em" }}>
<p style={{ fontSize: "0.9em" }}> <p style={{ fontSize: "0.9em" }}>
<b>{userName}</b> <b>{userName}</b>
</p> </p>

View File

@ -22,7 +22,7 @@ const MiniPhotos = (props) => {
const userSlug = const userSlug =
user.index && user.index > 0 ? `${slugBase}.${user.index}` : slugBase; user.index && user.index > 0 ? `${slugBase}.${user.index}` : slugBase;
const photosLink = `/fakebook/${userSlug}/Photos`; const photosLink = `/${userSlug}/Photos`;
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
@ -59,7 +59,7 @@ const MiniPhotos = (props) => {
}} }}
> >
<Link <Link
to={`/fakebook/photo/${userID}/${index}`} to={`/photo/${userID}/${index}`}
className='text-body' className='text-body'
onClick={handleClick} onClick={handleClick}
tabIndex='-1' tabIndex='-1'

View File

@ -23,21 +23,21 @@ const PhotoViewer = () => {
}, [location]); }, [location]);
const handleSelect = (selectedIndex, e) => { const handleSelect = (selectedIndex, e) => {
history.push(`/fakebook/photo/${userID}/${selectedIndex}`); history.push(`/photo/${userID}/${selectedIndex}`);
}; };
return ( return (
<Row <Row
className="bg-200" className='bg-200'
style={{ style={{
position: "relative", position: "relative",
top: "50px", top: "50px",
height: "89vh", height: "89vh",
}} }}
> >
<Col md={9} className="h-100" style={{ backgroundColor: "black" }}> <Col md={9} className='h-100' style={{ backgroundColor: "black" }}>
<Carousel <Carousel
className="w-100 h-100" className='w-100 h-100'
interval={null} interval={null}
indicators={false} indicators={false}
activeIndex={activeIndex} activeIndex={activeIndex}
@ -54,7 +54,7 @@ const PhotoViewer = () => {
> >
<StorageImage <StorageImage
storagePath={`/${userID}/${photo.fileName}`} storagePath={`/${userID}/${photo.fileName}`}
alt="" alt=''
style={{ style={{
position: "absolute", position: "absolute",
top: "50%", top: "50%",

View File

@ -28,15 +28,15 @@ const Photos = (props) => {
}, [activeLink, photosLinkRef, setActiveLink]); }, [activeLink, photosLinkRef, setActiveLink]);
return ( return (
<Card variant="light" className="w-100"> <Card variant='light' className='w-100'>
<Card.Body> <Card.Body>
<Card.Title> <Card.Title>
<Link to={url} className="text-body"> <Link to={url} className='text-body'>
<b>Photos</b> <b>Photos</b>
</Link> </Link>
{isCurrentUser && ( {isCurrentUser && (
<Button <Button
variant="link" variant='link'
style={{ style={{
textDecoration: "none", textDecoration: "none",
float: "right", float: "right",
@ -47,14 +47,14 @@ const Photos = (props) => {
</Button> </Button>
)} )}
</Card.Title> </Card.Title>
<Row className="w-100"> <Row className='w-100'>
{photos.map((photo, index) => { {photos.map((photo, index) => {
return ( return (
<Col key={index} xs={6} sm={4} md={3} lg={2} className="p-1"> <Col key={index} xs={6} sm={4} md={3} lg={2} className='p-1'>
<Link to={`/fakebook/photo/${userID}/${index}`}> <Link to={`/photo/${userID}/${index}`}>
<ResponsiveImage <ResponsiveImage
width="100%" width='100%'
height="100%" height='100%'
userID={userID} userID={userID}
photo={photo} photo={photo}
index={index} index={index}

View File

@ -133,80 +133,84 @@ const PostModal = (props) => {
<> <>
<Modal show={show} onHide={onClose}> <Modal show={show} onHide={onClose}>
<Modal.Header closeButton> <Modal.Header closeButton>
<div className="w-100 d-flex justify-content-center"> <div className='w-100 d-flex justify-content-center'>
<Modal.Title> <Modal.Title>
<b>Create Post</b> <b>Create Post</b>
</Modal.Title> </Modal.Title>
</div> </div>
</Modal.Header> </Modal.Header>
<Modal.Body> <Modal.Body>
<ProfileLink user={user} size="45" fullname="true" bold="true" /> <ProfileLink user={user} size='45' fullname='true' bold='true' />
<div className="mt-2 scrolling-container"> <div className='mt-2 scrolling-container'>
<textarea <textarea
type="text" type='text'
onChange={handleChange} onChange={handleChange}
className="w-100 mt-2 textarea" className='w-100 mt-2 textarea'
placeholder={getPlaceholder()} placeholder={getPlaceholder()}
rows={getRows()} rows={getRows()}
value={post.text}></textarea> value={post.text}
></textarea>
{post.isPhoto && ( {post.isPhoto && (
<div className="mb-2 img-container"> <div className='mb-2 img-container'>
<StorageImage <StorageImage
alt="" alt=''
storagePath={`/${post.photoURL}`} storagePath={`/${post.photoURL}`}
className="w-100 img-to-post" className='w-100 img-to-post'
/> />
<div className="close-btn-container"> <div className='close-btn-container'>
<CloseButton onClick={deletePhoto} /> <CloseButton onClick={deletePhoto} />
</div> </div>
</div> </div>
)} )}
{post.isYoutube && ( {post.isYoutube && (
<div className="mb-2 video-container"> <div className='mb-2 video-container'>
<iframe <iframe
src={post.youtubeURL} src={post.youtubeURL}
title="YouTube video player" title='YouTube video player'
frameBorder="0" allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope'
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope" allowFullScreen
allowFullScreen></iframe> ></iframe>
<div className="close-btn-container"> <div className='close-btn-container'>
<CloseButton onClick={deleteYoutubeVideo} /> <CloseButton onClick={deleteYoutubeVideo} />
</div> </div>
</div> </div>
)} )}
</div> </div>
<div className="w-100 my-2 add-to-post"> <div className='w-100 my-2 add-to-post'>
<b>Add to your post</b> <b>Add to your post</b>
<Button <Button
className="ml-2 add-photo-btn" className='ml-2 add-photo-btn'
variant="light" variant='light'
size="sm" size='sm'
onClick={addYoutubeVideo} onClick={addYoutubeVideo}
disabled={post.isPhoto || post.isYoutube}> disabled={post.isPhoto || post.isYoutube}
>
<AiFillYoutube <AiFillYoutube
size="26px" size='26px'
className="text-danger" className='text-danger'
aria-label="YouTube" aria-label='YouTube'
/> />
</Button> </Button>
<Button <Button
className="ml-2 add-photo-btn" className='ml-2 add-photo-btn'
variant="light" variant='light'
size="sm" size='sm'
onClick={() => setShowUploadPhotoDlg(true)} onClick={() => setShowUploadPhotoDlg(true)}
disabled={post.isPhoto || post.isYoutube}> disabled={post.isPhoto || post.isYoutube}
>
<HiOutlinePhotograph <HiOutlinePhotograph
size="26px" size='26px'
className="text-success" className='text-success'
aria-label="photo" aria-label='photo'
/> />
</Button> </Button>
</div> </div>
<Button <Button
variant={variant} variant={variant}
className="w-100 mt-3" className='w-100 mt-3'
disabled={disabled} disabled={disabled}
onClick={uploadPost}> onClick={uploadPost}
>
<b>Post</b> <b>Post</b>
</Button> </Button>
</Modal.Body> </Modal.Body>

View File

@ -16,10 +16,10 @@ const SelectBgPhotoModal = (props) => {
{photos.map((photo, index) => { {photos.map((photo, index) => {
return ( return (
<StorageImage <StorageImage
className="m-1" className='m-1'
width="31%" width='31%'
height="90px" height='90px'
alt="" alt=''
key={index} key={index}
id={index} id={index}
storagePath={`/${userID}/${photo.fileName}`} storagePath={`/${userID}/${photo.fileName}`}

View File

@ -15,9 +15,7 @@ import { handleClickLink } from "./helper";
import { linkUpdated } from "../features/link/linkSlice"; import { linkUpdated } from "../features/link/linkSlice";
import { friendsListPageSet } from "../features/accountPage/accountPageSlice"; import { friendsListPageSet } from "../features/accountPage/accountPageSlice";
const TitleBar = () => {
const TitleBar = (props) => {
const refs = { const refs = {
home: useRef(null), home: useRef(null),
friends: useRef(null), friends: useRef(null),
@ -50,79 +48,80 @@ const TitleBar = (props) => {
} }
return ( return (
<div className="titlebar bg-light"> <div className='titlebar bg-light'>
<Navbar bg="light" className="p-0 nav-container"> <Navbar bg='light' className='p-0 nav-container'>
<Navbar.Brand as={Link} to="/fakebook"> <Navbar.Brand as={Link} to='/'>
<FaFacebook color="dodgerblue" fontSize="2em" className="mx-3" /> <FaFacebook color='dodgerblue' fontSize='2em' className='mx-3' />
</Navbar.Brand> </Navbar.Brand>
<div style={{ width: "450px" }} className="spaceing" /> <div style={{ width: "450px" }} className='spaceing' />
<Nav className="w-75 justify-content-start mr-5"> <Nav className='w-75 justify-content-start mr-5'>
<Nav.Item className="first"> <Nav.Item className='first'>
<Link to="/fakebook" className="nav-link" ref={refs.home}> <Link to='/' className='nav-link' ref={refs.home}>
<VscHome <VscHome
fontSize="2rem" fontSize='2rem'
className="mx-4" className='mx-4'
style={{ pointerEvents: "none" }} style={{ pointerEvents: "none" }}
/> />
</Link> </Link>
</Nav.Item> </Nav.Item>
<Nav.Item> <Nav.Item>
<Link <Link to='/friends/list' className='nav-link' ref={refs.friends}>
to="/fakebook/friends/list"
className="nav-link"
ref={refs.friends}>
<FaUserFriends <FaUserFriends
fontSize="2rem" fontSize='2rem'
className="mx-4" className='mx-4'
style={{ pointerEvents: "none" }} style={{ pointerEvents: "none" }}
/> />
</Link> </Link>
</Nav.Item> </Nav.Item>
<Nav.Item> <Nav.Item>
<Link to="/fakebook/watch" className="nav-link" ref={refs.watch}> <Link to='/watch' className='nav-link' ref={refs.watch}>
<MdOndemandVideo <MdOndemandVideo
fontSize="2rem" fontSize='2rem'
className="mx-4" className='mx-4'
style={{ pointerEvents: "none" }} style={{ pointerEvents: "none" }}
/> />
</Link> </Link>
</Nav.Item> </Nav.Item>
</Nav> </Nav>
<Nav className="w-25 justify-content-end align-self-center"> <Nav className='w-25 justify-content-end align-self-center'>
<Nav.Item className="align-self-center first"> <Nav.Item className='align-self-center first'>
<Link <Link
to={profileLink} to={profileLink}
className="nav-link profile" className='nav-link profile'
id="profile" id='profile'
onClick={closeFriendsListPage} onClick={closeFriendsListPage}
ref={refs.profile}> ref={refs.profile}
<ProfileLink user={user} size="30" fullname="false" bold="true" /> >
<ProfileLink user={user} size='30' fullname='false' bold='true' />
</Link> </Link>
</Nav.Item> </Nav.Item>
<Nav.Item className="align-self-center"> <Nav.Item className='align-self-center'>
<DropdownButton <DropdownButton
title="" title=''
className="mr-4 custom-drop-down-btn" className='mr-4 custom-drop-down-btn'
menuAlign="right"> menuAlign='right'
>
<Dropdown.Item <Dropdown.Item
as={Link} as={Link}
to={profileLink} to={profileLink}
onClick={closeFriendsListPage}> onClick={closeFriendsListPage}
>
<ProfileLink <ProfileLink
user={user} user={user}
size="60" size='60'
fullname="true" fullname='true'
bold="true" bold='true'
/> />
</Dropdown.Item> </Dropdown.Item>
<Dropdown.Divider /> <Dropdown.Divider />
<Dropdown.Item <Dropdown.Item
as={Link} as={Link}
to="/fakebook/" to='/'
onClick={handleClick} onClick={handleClick}
className="p-0"> className='p-0'
<ImExit fontSize="1.5em" className="mx-4" /> >
<ImExit fontSize='1.5em' className='mx-4' />
<span>Log Out</span> <span>Log Out</span>
<div style={{ width: "20em" }}></div> <div style={{ width: "20em" }}></div>
</Dropdown.Item> </Dropdown.Item>

View File

@ -38,7 +38,6 @@ import {
/* Mock-backend helpers */ /* Mock-backend helpers */
import { import {
currentUserOffline,
currentUserOnline, currentUserOnline,
subscribeCurrentUser, subscribeCurrentUser,
subscribeUsers, subscribeUsers,
@ -56,16 +55,24 @@ const RouteStateSync = () => {
const location = useLocation(); const location = useLocation();
const isFriendsListPage = useSelector(
(state) => state.accountPage.isFriendsListPage
);
useEffect(() => { useEffect(() => {
const { pathname } = location; const { pathname } = location;
/* friends list page */ /* friends list page */
dispatch(friendsListPageSet(pathname.startsWith("/fakebook/friends/list"))); dispatch(
friendsListPageSet(
pathname.startsWith("/friends/list") || isFriendsListPage
)
);
/* watch page (videos feed) */ /* watch page (videos feed) */
dispatch(watchSet(pathname.startsWith("/fakebook/watch"))); dispatch(watchSet(pathname.startsWith("/watch")));
}, [location, dispatch]); }, [location, dispatch]);
return null; // renders nothing return null; // renders nothing
@ -84,6 +91,10 @@ const UserAccount = () => {
const users = useSelector((state) => state.users); const users = useSelector((state) => state.users);
const isFriendsListPage = useSelector(
(state) => state.accountPage.isFriendsListPage
);
/* -------------------------------------------------- */ /* -------------------------------------------------- */
/* Firestore-like subscriptions */ /* Firestore-like subscriptions */
@ -146,9 +157,9 @@ const UserAccount = () => {
/* -------------------------------------------------- */ /* -------------------------------------------------- */
return ( return (
<div className="bg-200 vw-100 main-container overflow-hidden"> <div className='bg-200 vw-100 main-container overflow-hidden'>
<Container className="w-100 p-0" fluid> <Container className='w-100 p-0' fluid>
<Router> <Router basename='/fakebook-aigen'>
<RouteStateSync /> <RouteStateSync />
<TitleBar /> <TitleBar />
@ -156,29 +167,32 @@ const UserAccount = () => {
<Switch> <Switch>
{/* Friends list ------------------------------------------------ */} {/* Friends list ------------------------------------------------ */}
<Route path="/fakebook/friends/list" component={FriendsListPage} /> <Route path='/friends/list' component={FriendsListPage} />
{/* Single photo ----------------------------------------------- */} {/* Single photo ----------------------------------------------- */}
<Route path="/fakebook/photo/:userID/:n" component={PhotoViewer} /> <Route path='/photo/:userID/:n' component={PhotoViewer} />
{/* Watch (video feed) ----------------------------------------- */} {/* Watch (video feed) ----------------------------------------- */}
<Route <Route
path="/fakebook/watch" path='/watch'
render={(props) => <HomePage {...props} className="pt-5" />} render={(props) => <HomePage {...props} className='pt-5' />}
/> />
{/* User profile ----------------------------------------------- */} {/* User profile ----------------------------------------------- */}
<Route path="/fakebook/:userName" component={Profile} /> <Route
path='/:userName'
component={isFriendsListPage ? FriendsListPage : Profile}
/>
{/* News-feed root --------------------------------------------- */} {/* News-feed root --------------------------------------------- */}
<Route <Route
path="/fakebook" path='/'
exact exact
render={(props) => <HomePage {...props} className="pt-5" />} render={(props) => <HomePage {...props} className='pt-5' />}
/> />
</Switch> </Switch>
</Router> </Router>

View File

@ -1,7 +1,8 @@
import { defineConfig } from 'vite' import { defineConfig } from "vite";
import preact from '@preact/preset-vite' import preact from "@preact/preset-vite";
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [preact()], plugins: [preact()],
}) base: "/fakebook-aigen/", // <--- ADD THIS AS THE REPO NAME
});