This is works

Seto Elkahfi committed Aug 2, 2023 at 12:00 UTC e78e935556d3f9b13e84955897b8fad6acf40d70
12 files changed +135 -65
.gitignore
+1
@@ -13,6 +13,7 @@
13
14 # production
15 /build
16 +/server/build/*
17
18 # misc
19 .DS_Store
package-lock.json
+15 -4
@@ -11,7 +11,7 @@
11 "@babel/runtime": "^7.16.7",
12 "@types/jest": "^24.9.1",
13 "@types/node": "^13.13.52",
14 - "@types/react": "^16.14.21",
14 + "@types/react": "^16.14.43",
15 "@types/react-dom": "^16.9.14",
16 "@types/react-router-dom": "^5.3.2",
17 "axios": "^0.25.0",
@@ -32,6 +32,7 @@
32 "typescript": "^4.0.0"
33 },
34 "devDependencies": {
35 + "@types/dexie": "^1.3.1",
36 "@types/express": "^4.17.17",
37 "@types/react-intl": "^3.0.0"
38 }
@@ -4415,6 +4416,16 @@
4416 "@types/node": "*"
4417 }
4418 },
4419 + "node_modules/@types/dexie": {
4420 + "version": "1.3.1",
4421 + "resolved": "https://registry.npmjs.org/@types/dexie/-/dexie-1.3.1.tgz",
4422 + "integrity": "sha512-f4Gpv89MCwEl1r9LbLLHXzT2qduVUNfyj/sINrY7MXqZvSEGYZwEWLIUAnVD44YPt5/0tkNSK6wbyhpb9iF47A==",
4423 + "deprecated": "This is a stub types definition for Dexie.js (https://github.com/dfahlander/Dexie.js). Dexie.js provides its own type definitions, so you don't need @types/dexie installed!",
4424 + "dev": true,
4425 + "dependencies": {
4426 + "dexie": "*"
4427 + }
4428 + },
4429 "node_modules/@types/eslint": {
4430 "version": "8.44.1",
4431 "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.1.tgz",
@@ -4582,9 +4593,9 @@
4593 "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
4594 },
4595 "node_modules/@types/react": {
4585 - "version": "16.14.21",
4586 - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.21.tgz",
4587 - "integrity": "sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg==",
4596 + "version": "16.14.43",
4597 + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.43.tgz",
4598 + "integrity": "sha512-7zdjv7jvoLLQg1tTvpQsm+hyNUMT2mPlNV1+d0I8fbGhkJl82spopMyBlu4wb1dviZAxpGdk5eHu/muacknnfw==",
4599 "dependencies": {
4600 "@types/prop-types": "*",
4601 "@types/scheduler": "*",
package.json
+5 -3
@@ -6,7 +6,7 @@
6 "@babel/runtime": "^7.16.7",
7 "@types/jest": "^24.9.1",
8 "@types/node": "^13.13.52",
9 - "@types/react": "^16.14.21",
9 + "@types/react": "^16.14.43",
10 "@types/react-dom": "^16.9.14",
11 "@types/react-router-dom": "^5.3.2",
12 "axios": "^0.25.0",
@@ -30,8 +30,9 @@
30 "client:start": "PORT=3002 react-scripts start",
31 "client:build": "react-scripts build",
32 "client:test": "react-scripts test",
33 - "eject": "react-scripts eject",
34 - "server:start": "node server/server.js"
33 + "client:eject": "react-scripts eject",
34 + "server:build": "npx tsc --project ./tsconfig.server.json --outDir ./build",
35 + "server:start": "node ./build/server/server.js"
36 },
37 "eslintConfig": {
38 "extends": "react-app"
@@ -43,6 +44,7 @@
44 "not op_mini all"
45 ],
46 "devDependencies": {
47 + "@types/dexie": "^1.3.1",
48 "@types/express": "^4.17.17",
49 "@types/react-intl": "^3.0.0"
50 }
server/index.tsx deleted
-33
@@ -1,33 +0,0 @@
1 -import path from "path";
2 -import fs from "fs";
3 -
4 -import React from "react";
5 -import ReactDOMServer from "react-dom/server";
6 -import express from "express";
7 -
8 -const PORT = process.env.PORT || 3000;
9 -const app = express();
10 -
11 -app.get("/", (req, res) => {
12 - fs.readFile(path.resolve("./public/index.html"), "utf8", (err, data) => {
13 - if (err) {
14 - console.error(err);
15 - return res.status(500).send("An error occurred");
16 - }
17 -
18 - return res.send(
19 - data.replace(
20 - '<div id="root"></div>',
21 - `<div id="root">${ReactDOMServer.renderToString(<App />)}</div>`
22 - )
23 - );
24 - });
25 -});
26 -
27 -app.use(
28 - express.static(path.resolve(__dirname, ".", "dist"), { maxAge: "30d" })
29 -);
30 -
31 -app.listen(PORT, () => {
32 - console.log(`Server is listening on port ${PORT}`);
33 -});
\ No newline at end of file
server/server.tsx new
+42
@@ -0,0 +1,42 @@
1 +import express from 'express'
2 +import React from 'react'
3 +import ReactDOMServer from 'react-dom/server'
4 +import App from '../src/components/App'
5 +import path from 'path';
6 +import fs from 'fs';
7 +import { StaticRouter, matchPath } from 'react-router-dom';
8 +import routes from '../shared/routes';
9 +
10 +const server = express();
11 +
12 +server.use('/static', express.static('./build/static'));
13 +
14 +server.get('*', (req, res, next) => {
15 +
16 + const activeRoute = routes.find((route) =>
17 + matchPath(route.path, req.url)
18 + ) || {}
19 +
20 + const app = ReactDOMServer.renderToString(
21 + <StaticRouter location={req.url}>
22 + <App />
23 + </StaticRouter>
24 + );
25 +
26 + const indexFile = path.resolve('./build/index.html');
27 +
28 + fs.readFile(indexFile, 'utf8', (err, data) => {
29 + if (err) {
30 + console.error('Something went wrong:', err);
31 + return res.status(500).send('Oops, better luck next time!');
32 + }
33 +
34 + return res.send(
35 + data.replace('<div id="root"></div>', `<div id="root">${app}</div>`)
36 + );
37 + });
38 +});
39 +
40 +server.listen(3002, () => {
41 + console.log(`Server running on http://localhost:3002`)
42 +})
\ No newline at end of file
shared/routes.tsx new
+16
@@ -0,0 +1,16 @@
1 +import Home from '../src/components/Home';
2 +import About from '../src/components/About';
3 +
4 +// Desc: Routes for the application
5 +const routes = [
6 + {
7 + path: '/',
8 + component: Home,
9 + },
10 + {
11 + path: '/about',
12 + component: About,
13 + }
14 +];
15 +
16 +export default routes;
\ No newline at end of file
src/components/App.tsx
+11 -14
@@ -3,7 +3,6 @@ import Header from './Header';
3 import Main from './Main';
4 import FooterLinks from './FooterLinks';
5 import { IntlProvider, addLocaleData } from 'react-intl';
6 -import { BrowserRouter } from 'react-router-dom';
6 import Firebase, { FirebaseContext } from '../components/Firebase';
7 import localeEn from 'react-intl/locale-data/en';
8 import localeSe from 'react-intl/locale-data/se';
@@ -23,12 +22,12 @@ import messagesEs from "../translations/es.json";
22 import messagesJa from "../translations/ja.json";
23
24 addLocaleData([
26 - ...localeEn,
27 - ...localeId,
28 - ...localeSe,
29 - ...localeDe,
30 - ...localeFr,
31 - ...localeZh,
25 + ...localeEn,
26 + ...localeId,
27 + ...localeSe,
28 + ...localeDe,
29 + ...localeFr,
30 + ...localeZh,
31 ...localeEs,
32 ...localeJa
33 ]);
@@ -79,13 +78,11 @@ class App extends Component<AppProps, AppState> {
78 render() {
79 return (
80 <IntlProvider locale={i18nConfig.language} messages={i18nConfig.messages}>
82 - <BrowserRouter>
83 - <FirebaseContext.Provider value={this.createFirebaseContextIfNeeded(i18nConfig.language)}>
84 - <Header onChangeLanguage={this.onChangeLanguage.bind(this)} />
85 - <Main />
86 - <FooterLinks />
87 - </FirebaseContext.Provider>
88 - </BrowserRouter>
81 + <FirebaseContext.Provider value={this.createFirebaseContextIfNeeded(i18nConfig.language)}>
82 + <Header onChangeLanguage={this.onChangeLanguage.bind(this)} />
83 + <Main />
84 + <FooterLinks />
85 + </FirebaseContext.Provider>
86 </IntlProvider >
87 );
88 }
src/components/Main.tsx
-1
@@ -48,7 +48,6 @@ const Main = () => (
48 {firebase => <Contact firebase={firebase} />}
49 </FirebaseContext.Consumer>
50 </Route>
51 - <Route exact path='/splitfire/:audio_id' render={(props) => <AudioPlayer audioFileId={props.match.params.audio_id} /> }/>
51 </Switch>
52 </div>
53 </div>
src/index.tsx
+10 -4
@@ -1,15 +1,21 @@
1 import React from 'react';
2 -import { render } from 'react-dom';
2 +import { hydrate } from 'react-dom';
3 import App from './components/App';
4 -import * as serviceWorker from './serviceWorker';
4 +//import * as serviceWorker from './serviceWorker';
5 import 'bootstrap/dist/css/bootstrap.css';
6 import axios from 'axios';
7 +import { BrowserRouter } from 'react-router-dom';
8
9 axios.defaults.baseURL = 'https://api.musik88.com/api/v1/';
10
10 -render(<App />, document.getElementById('root'));
11 +hydrate(
12 + <BrowserRouter>
13 + <App />
14 + </BrowserRouter>,
15 + document.getElementById('root')
16 +);
17
18 // If you want your app to work offline and load faster, you can change
19 // unregister() to register() below. Note this comes with some pitfalls.
20 // Learn more about service workers: http://bit.ly/CRA-PWA
15 -serviceWorker.unregister();
21 +//serviceWorker.unregister();
tsconfig.json
+1 -1
@@ -25,7 +25,7 @@
25 "noFallthroughCasesInSwitch": true
26 },
27 "include": [
28 - "src"
28 + "src", "server"
29 ],
30 "exclude": [
31 "node_modules",
tsconfig.server.json new
+22
@@ -0,0 +1,22 @@
1 +{
2 + "include": ["server"], // compile TS files in server directory
3 + "compilerOptions": {
4 + "module": "commonjs", // classic format that Node.js understands
5 + "esModuleInterop": true, // allow imports of modules in ES format
6 + "skipLibCheck": true, // only check types we refer to from our code
7 + "forceConsistentCasingInFileNames": true, // prevents cross-OS problems
8 + "resolveJsonModule": true, // enable import of JSON files
9 + "lib": ["es6", "dom"], // use JavaScript API ES6
10 + "target": "es6", // compile to ES6
11 + "jsx": "react", // compile JSX to React.createElement statements for SSR
12 + "allowJs": true, // allow import of JS modules
13 + // enable strict type checking
14 + "strict": true,
15 + "strictNullChecks": true,
16 + "noImplicitAny": true,
17 + "typeRoots": [
18 + "./types",
19 + "./node_modules/@types"
20 + ],
21 + }
22 + }
\ No newline at end of file
yarn.lock
+12 -5
@@ -2164,6 +2164,13 @@
2164 dependencies:
2165 "@types/node" "*"
2166
2167 +"@types/dexie@^1.3.1":
2168 + version "1.3.1"
2169 + resolved "https://registry.npmjs.org/@types/dexie/-/dexie-1.3.1.tgz"
2170 + integrity sha512-f4Gpv89MCwEl1r9LbLLHXzT2qduVUNfyj/sINrY7MXqZvSEGYZwEWLIUAnVD44YPt5/0tkNSK6wbyhpb9iF47A==
2171 + dependencies:
2172 + dexie "*"
2173 +
2174 "@types/eslint-scope@^3.7.3":
2175 version "3.7.4"
2176 resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz"
@@ -2371,10 +2378,10 @@
2378 dependencies:
2379 "@types/react" "*"
2380
2374 -"@types/react@*", "@types/react@^16", "@types/react@^16.14.21", "@types/react@>=16.14.8", "@types/react@>=16.9.11":
2375 - version "16.14.21"
2376 - resolved "https://registry.npmjs.org/@types/react/-/react-16.14.21.tgz"
2377 - integrity sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg==
2381 +"@types/react@*", "@types/react@^16", "@types/react@^16.14.43", "@types/react@>=16.14.8", "@types/react@>=16.9.11":
2382 + version "16.14.43"
2383 + resolved "https://registry.npmjs.org/@types/react/-/react-16.14.43.tgz"
2384 + integrity sha512-7zdjv7jvoLLQg1tTvpQsm+hyNUMT2mPlNV1+d0I8fbGhkJl82spopMyBlu4wb1dviZAxpGdk5eHu/muacknnfw==
2385 dependencies:
2386 "@types/prop-types" "*"
2387 "@types/scheduler" "*"
@@ -4078,7 +4085,7 @@ detect-port-alt@^1.1.6:
4085 address "^1.0.1"
4086 debug "^2.6.0"
4087
4081 -dexie@^3.2.0:
4088 +dexie@*, dexie@^3.2.0:
4089 version "3.2.0"
4090 resolved "https://registry.npmjs.org/dexie/-/dexie-3.2.0.tgz"
4091 integrity sha512-OpS8ss1CLHYAhxRu6hT+/Gt1uLhKCf0O18xHBdRGlemOWXXRiiOZ0ty1/bACIJzGt1DGmvarzrPwYYt9EkRZfw==