diff --git a/Dockerfile b/Dockerfile index a33ef52..c722023 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,11 +20,7 @@ RUN if [ ! -d "dist" ] && [ ! -d "node_modules" ]; then npm install; fi RUN BUILD_MODE=$([ "$NODE_ENV" = "prod" ] && echo "prod" || echo "dev") && \ if [ ! -d "dist" ]; then npm run "build:$BUILD_MODE"; fi -# Use Nginx to serve -FROM nginx:1.20-alpine -COPY --from=build /app/dist /usr/share/nginx/html -COPY docker/config/robots.txt /usr/share/nginx/html/robots.txt -COPY docker/config/nginx.conf /etc/nginx/nginx.conf -COPY docker/scripts/setup-environment.sh /docker-entrypoint.d/setup-environment.sh -RUN chmod +x /docker-entrypoint.d/setup-environment.sh -EXPOSE 80 +# Use Momentum to serve +FROM git.zakscode.com/momentum/momentum:diarization +RUN rm -rf /app/server/public/assets /app/server/public/index.html +COPY --from=build /app/dist /app/server/public diff --git a/README.md b/README.md index 815ef77..9148adb 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ Website: https://legio-30.org ### Built With [![Angular](https://img.shields.io/badge/Angular-DD0031?style=for-the-badge&logo=angular)](https://angular.io/) [![Docker](https://img.shields.io/badge/Docker-384d54?style=for-the-badge&logo=docker)](https://docker.com/) +[![Momentum](https://img.shields.io/badge/Momentum-4c7bbc?style=for-the-badge)](https://momentum.zakscode.com) [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white)](https://typescriptlang.org/) ## Setup diff --git a/package-lock.json b/package-lock.json index ade76a5..2d38896 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@angular/platform-browser": "^14.2.0", "@angular/platform-browser-dynamic": "^14.2.0", "@angular/router": "^14.2.0", + "@ztimson/momentum": "^1.1.11", "bootstrap": "^5.2.1", "jquery": "^3.6.1", "ngx-google-analytics": "^14.0.1", @@ -3340,6 +3341,26 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "node_modules/@ztimson/momentum": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@ztimson/momentum/-/momentum-1.1.11.tgz", + "integrity": "sha512-ArFIOJj0mCbvR/P6XBlOjvICytf3ggPClbMmDDsZNtLMGXIZ+HqNjt58LDuEpLr3a8pe0mXEZ3jGkIAv2no8mA==", + "dependencies": { + "@ztimson/utils": "0.29.1" + }, + "bin": { + "build-models": "bin/build-models.mjs" + } + }, + "node_modules/@ztimson/utils": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@ztimson/utils/-/utils-0.29.1.tgz", + "integrity": "sha512-tc1Eikjt7bwMHoOvck5eSnV3P69FOVNp6z7n/v1IoEtBmHLtPgz8LsxUtSYLnvl96HZ1bNkvQfuuUxrBob5dJQ==", + "license": "MIT", + "dependencies": { + "var-persist": "^1.0.1" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -11205,6 +11226,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/var-persist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/var-persist/-/var-persist-1.0.1.tgz", + "integrity": "sha512-Zon+pwvEpb0dEQCVShoMQQWV1JbWi4P2knW3h2sfSZS3pLecgbFig76tMSHEECQuEQ3KfYhMXgRDDIybtHTyZw==", + "license": "MIT" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -14070,6 +14097,22 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "@ztimson/momentum": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@ztimson/momentum/-/momentum-1.1.11.tgz", + "integrity": "sha512-ArFIOJj0mCbvR/P6XBlOjvICytf3ggPClbMmDDsZNtLMGXIZ+HqNjt58LDuEpLr3a8pe0mXEZ3jGkIAv2no8mA==", + "requires": { + "@ztimson/utils": "0.29.1" + } + }, + "@ztimson/utils": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@ztimson/utils/-/utils-0.29.1.tgz", + "integrity": "sha512-tc1Eikjt7bwMHoOvck5eSnV3P69FOVNp6z7n/v1IoEtBmHLtPgz8LsxUtSYLnvl96HZ1bNkvQfuuUxrBob5dJQ==", + "requires": { + "var-persist": "^1.0.1" + } + }, "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -19750,6 +19793,11 @@ "builtins": "^5.0.0" } }, + "var-persist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/var-persist/-/var-persist-1.0.1.tgz", + "integrity": "sha512-Zon+pwvEpb0dEQCVShoMQQWV1JbWi4P2knW3h2sfSZS3pLecgbFig76tMSHEECQuEQ3KfYhMXgRDDIybtHTyZw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 736d2d9..b5450ce 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@angular/platform-browser": "^14.2.0", "@angular/platform-browser-dynamic": "^14.2.0", "@angular/router": "^14.2.0", + "@ztimson/momentum": "^1.1.11", "bootstrap": "^5.2.1", "jquery": "^3.6.1", "ngx-google-analytics": "^14.0.1", diff --git a/src/app/services/momentum.service.ts b/src/app/services/momentum.service.ts new file mode 100644 index 0000000..8508178 --- /dev/null +++ b/src/app/services/momentum.service.ts @@ -0,0 +1,50 @@ +import {Injectable} from '@angular/core'; +import {Momentum, type User} from '@ztimson/momentum'; +import {BehaviorSubject} from 'rxjs'; +import {from, map} from 'rxjs'; +import {filter} from 'rxjs/operators'; + +declare global { + interface Window { + momentum: Momentum; + electronEnvironment: any; + } + + interface location { + port: string; + } +} + +@Injectable({providedIn: 'root'}) +export class MomentumService { + static SCHEMA: {[key: string]: string} = { + // TODO: Add paths + } + + api!: Momentum; + + installable = new BehaviorSubject(false); + settings = new BehaviorSubject<{[key: string]: any}>({}); + title = new BehaviorSubject(null); + + // @ts-ignore + user = new BehaviorSubject(undefined); // Undefined at init, null when logged out, object when logged in. + admin = from(this.user).pipe(filter((u: any) => u !== undefined), map((u: User | null) => u?.groups.includes('admin'))); + isLoggedIn = from(this.user).pipe(filter(u => u !== undefined), map(Boolean)); + + constructor() { + this.api = new Momentum("https://legio-30.org", { + app: "Website", + analytics: "prompt", + logLevel: "ERROR", + }); + + this.api.auth.on('logout', () => location.reload()); + this.api.client.on('install', () => this.installable.next(this.api.client.canInstall)); + this.installable.next(this.api.client.canInstall); + this.api.settings.sync((event, value) => { + this.title.next(value['title']); + this.settings.next(value); + }, {map: true}); + } +}