Skip to content

Commit 5ceb14c

Browse files
authored
Merge pull request #381 from SpiritFour/modernization/nuxt4-migration
Migrate frontend to Nuxt 4 and Vue 3
2 parents 21efe8e + 9e06cf5 commit 5ceb14c

87 files changed

Lines changed: 21719 additions & 14825 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
test/*
22
static/sw.js
3+
.delta
34
.direnv
45
.idea
56
.nuxt

.eslintrc.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,17 @@ parserOptions:
1313
sourceType: module
1414
plugins:
1515
- vue
16+
globals:
17+
defineI18nConfig: readonly
18+
defineNuxtConfig: readonly
19+
defineNuxtPlugin: readonly
20+
queryCollection: readonly
21+
useAsyncData: readonly
22+
useRuntimeConfig: readonly
23+
useSeoMeta: readonly
24+
useI18n: readonly
25+
useSwitchLocalePath: readonly
26+
navigateTo: readonly
27+
computed: readonly
28+
ref: readonly
1629
rules: {}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Integration tests against the real PayPal sandbox through the Firebase
2+
# Functions emulator. Runs only when the PAYPAL_PASSWORD_DEV secret is
3+
# configured (never on forks) and is not a required check.
4+
name: PayPal Sandbox E2E
5+
6+
on:
7+
- push
8+
- workflow_dispatch
9+
10+
jobs:
11+
check-secret:
12+
runs-on: ubuntu-latest
13+
outputs:
14+
available: ${{ steps.check.outputs.available }}
15+
steps:
16+
- id: check
17+
run: echo "available=${{ secrets.PAYPAL_PASSWORD_DEV != '' }}" >> "$GITHUB_OUTPUT"
18+
19+
sandbox-e2e:
20+
needs: check-secret
21+
if: needs.check-secret.outputs.available == 'true'
22+
runs-on: ubuntu-latest
23+
steps:
24+
- uses: actions/checkout@v4
25+
- uses: pnpm/action-setup@v4
26+
- uses: actions/setup-node@v4
27+
with:
28+
node-version: 22
29+
cache: pnpm
30+
- run: pnpm install --frozen-lockfile
31+
- run: npm ci
32+
working-directory: functions
33+
- run: pnpm exec playwright install --with-deps chromium
34+
- name: Provide emulator secrets
35+
run: |
36+
{
37+
echo "PAYPAL_PASSWORD_DEV=${PAYPAL_PASSWORD_DEV}"
38+
echo "PAYPAL_PASSWORD_PROD=unused-in-sandbox-tests"
39+
} > functions/.secret.local
40+
env:
41+
PAYPAL_PASSWORD_DEV: ${{ secrets.PAYPAL_PASSWORD_DEV }}
42+
- run: pnpm test:e2e:sandbox
43+
- uses: actions/upload-artifact@v4
44+
if: failure()
45+
with:
46+
name: sandbox-e2e-traces
47+
path: test-results
48+
retention-days: 7

.gitignore

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ npm-debug.log*
77
yarn-debug.log*
88
yarn-error.log*
99
package-lock.json
10+
!functions/package-lock.json
1011
yarn.lock
1112
sw.*
1213
.vscode
@@ -22,6 +23,8 @@ lib-cov
2223

2324
# Coverage directory used by tools like istanbul
2425
coverage
26+
playwright-report
27+
test-results
2528

2629
# nyc test coverage
2730
.nyc_output
@@ -63,6 +66,9 @@ typings/
6366
# dotenv environment variables file
6467
.env
6568

69+
# local Firebase emulator secrets (PAYPAL_PASSWORD_DEV etc.)
70+
.secret.local
71+
6672
# parcel-bundler cache (https://parceljs.org/)
6773
.cache
6874

@@ -71,6 +77,8 @@ typings/
7177

7278
# nuxt.js build output
7379
.nuxt
80+
.data
81+
.output
7482

7583
# Nuxt generate
7684
dist
@@ -97,4 +105,10 @@ sw.*
97105

98106
Icon\r
99107

108+
109+
# omp delta agent worktrees
110+
.delta/
100111
.direnv
112+
113+
# husky v9 generated helpers
114+
.husky/_/

.husky/pre-commit

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/sh
2+
if command -v pnpm >/dev/null 2>&1; then
3+
pnpm exec lint-staged
4+
elif command -v nix >/dev/null 2>&1; then
5+
nix develop --command pnpm exec lint-staged
6+
else
7+
npx --no-install lint-staged
8+
fi

.prettierignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ dist
44
node_modules
55
coverage
66
pnpm-lock.yaml
7+
playwright-report
8+
test-results
79
test/*
810
static/sw.js
911
.direnv
1012
.idea
1113
.nuxt
14+
.output
1215
node_modules
1316
nuxt.config.js

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ No data about your chat is transferred to any server at all.
1212

1313
Dev deployment: https://whatsanalyze-80665.web.app
1414

15+
## Maintainer documentation
16+
17+
Read [`docs/modernization-runbook.md`](docs/modernization-runbook.md) before
18+
upgrading dependencies or changing the frontend, PDF, localization, Firebase,
19+
or PayPal integrations. It records the current architecture, migration
20+
decisions, deployment procedure, verification commands, and known follow-up
21+
work.
22+
1523
## Encountered an issue?
1624

1725
Please report bugs in the github issues.

assets/_theme-variables.scss

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Whatsapp theme colors
2+
$whatsappThemeColor: #07bc4c;
3+
$darkBackgroundColor: #0d1418;
4+
$lightBackgroundColor: #e5ddd5;
5+
6+
// Monotone colors
7+
$c-dark: #022e40;
8+
$c-dark-accent: #032859;
9+
$c-white: #f2f2f2;
10+
$c-white-dark: #bfbfbf;
11+
$c-white-accent: #e1e1e1;
12+
13+
// Blue colors
14+
$c-blue-accent: #21a68d;
15+
$c-blue-accent-light: #60d8bd;
16+
$c-blue-accent-dark: #227373;
17+
$c-blue-secondary: #0c808c;
18+
$c-blue-secondary-light: #51b0bc;
19+
$c-blue-secondary-dark: #00535f;
20+
$c-blue-dark: #11538c;
21+
22+
// Green colors
23+
$c-green: #88a825;
24+
$c-green-accent: #b3f94f;
25+
26+
// Yellow colors
27+
$c-yellow: #ffd45c;
28+
$c-yellow-accent: #ffa35c;
29+
$c-yellow-bright: #ffd800;
30+
$c-yellow-bright-accent: #fd9924;
31+
32+
// Orange colors
33+
$c-orange: #fe6a2c;
34+
$c-orange-accent: #ffbf5c;
35+
$c-orange-dark: #cf4a30;
36+
$c-orange-dark-accent: #ed8c2b;
37+
38+
// Red colors
39+
$c-red: #ff675c;
40+
$c-red-light: #ff855c;
41+
$c-red-dark: #d93b3b;
42+
$c-red-dark-accent: #911146;

assets/variables.scss

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,4 @@
1-
// ---- COLORS -----
2-
3-
// Whatsapp Theme color
4-
$whatsappThemeColor: #07bc4c;
5-
$darkBackgroundColor: #0d1418;
6-
$lightBackgroundColor: #e5ddd5;
7-
8-
// MONOTONE
9-
// -- dark colors
10-
$c-dark: #022e40;
11-
$c-dark-accent: #032859;
12-
13-
// -- light colors
14-
$c-white: #f2f2f2;
15-
$c-white-dark: #bfbfbf;
16-
$c-white-accent: #e1e1e1;
17-
18-
// BLUE
19-
$c-blue-accent: #21a68d;
20-
$c-blue-accent-light: #60d8bd;
21-
$c-blue-accent-dark: #007660;
22-
23-
$c-blue-secondary: #0c808c;
24-
$c-blue-secondary-light: #51b0bc;
25-
$c-blue-secondary-dark: #00535f;
26-
27-
$c-blue-dark: #11538c;
28-
$c-blue-accent-dark: #227373;
29-
30-
// WHITE
31-
$c-green: #88a825;
32-
$c-green-accent: #b3f94f;
33-
34-
// YELLOW
35-
$c-yellow: #ffd45c;
36-
$c-yellow-accent: #ffa35c;
37-
38-
$c-yellow-bright: #ffd800;
39-
$c-yellow-bright-accent: #fd9924;
40-
41-
// ORANGE
42-
$c-orange: #fe6a2c;
43-
$c-orange-accent: #ffbf5c;
44-
$c-orange-dark: #cf4a30;
45-
$c-orange-dark-accent: #ed8c2b;
46-
47-
// RED
48-
$c-red: #ff675c;
49-
$c-red-light: #ff855c;
50-
$c-red-dark: #d93b3b;
51-
$c-red-dark-accent: #911146;
1+
@use "theme-variables" as *;
522

533
.top-color {
544
background-color: $c-blue-accent;
@@ -58,8 +8,6 @@ $c-red-dark-accent: #911146;
588
display: none;
599
}
6010

61-
@import "~vuetify/src/styles/styles.sass";
62-
6311
.cta {
6412
background: $c-white;
6513
width: 100%;

components/About.vue

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,42 +57,38 @@
5757
</template>
5858

5959
<script>
60+
import adrianImage from "~/assets/img/us/Adrian_WA.jpg";
61+
import moritzImage from "~/assets/img/us/Moritz_WA.jpeg";
62+
import paulImage from "~/assets/img/us/Paul_WA.jpg";
63+
import sebastianImage from "~/assets/img/us/Sebastian_WA.jpg";
64+
import osloLogo from "~/assets/img/uni/Oslo_Logo.png";
65+
import otagoLogo from "~/assets/img/uni/Otago_Logo.png";
66+
import stockholmLogo from "~/assets/img/uni/Stockholm_Logo.png";
67+
import tumLogo from "~/assets/img/uni/TUM_Logo.png";
68+
6069
export default {
6170
name: "About",
6271
data() {
6372
return {
64-
universities: [
65-
// eslint-disable-next-line no-undef
66-
require("~/assets/img/uni/TUM_Logo.png"),
67-
// eslint-disable-next-line no-undef
68-
require("~/assets/img/uni/Oslo_Logo.png"),
69-
// eslint-disable-next-line no-undef
70-
require("~/assets/img/uni/Otago_Logo.png"),
71-
// eslint-disable-next-line no-undef
72-
require("~/assets/img/uni/Stockholm_Logo.png"),
73-
],
73+
universities: [tumLogo, osloLogo, otagoLogo, stockholmLogo],
7474
persons: [
7575
{
76-
// eslint-disable-next-line no-undef
77-
image: require("~/assets/img/us/Sebastian_WA.jpg"),
76+
image: sebastianImage,
7877
name: "Sebastian Fellner",
7978
description: ["Computer Science MSc", "AI Enthusiast"],
8079
},
8180
{
82-
// eslint-disable-next-line no-undef
83-
image: require("~/assets/img/us/Paul_WA.jpg"),
81+
image: paulImage,
8482
name: "Paul Kehnel",
8583
description: ["Computer Science MSc", "Bicycle Dude"],
8684
},
8785
{
88-
// eslint-disable-next-line no-undef
89-
image: require("~/assets/img/us/Adrian_WA.jpg"),
86+
image: adrianImage,
9087
name: "Adrian Thiesen",
9188
description: ["Information Systems BSc", "The Product Enthusiast"],
9289
},
9390
{
94-
// eslint-disable-next-line no-undef
95-
image: require("~/assets/img/us/Moritz_WA.jpeg"),
91+
image: moritzImage,
9692
name: "Moritz Wolf",
9793
description: ["Robotics MSc", "Outdoor Specialist"],
9894
},

0 commit comments

Comments
 (0)