diff --git a/config/abrechnung.yaml b/config/abrechnung.yaml index b72111d4..9c04b96b 100644 --- a/config/abrechnung.yaml +++ b/config/abrechnung.yaml @@ -1,7 +1,8 @@ -#service: -# url: "https://abrechnung.example.lol" -# api_url: "https://abrechnung.example.lol/api" -# name: "Abrechnung" + +service: + url: "http://localhost" + api_url: "http://localhost/api" + name: "Abrechnung" database: host: "localhost" @@ -10,7 +11,7 @@ database: # password: "" api: -# secret_key: "" + secret_key: "please generate a unique one with pwgen -s 64 1" host: "localhost" port: 8080 id: default @@ -18,11 +19,11 @@ api: registration: enabled: false -# email: -# address: "abrechnung@example.lol" -# host: "localhost" -# port: 587 -# mode: "smtp-starttls" -# auth: -# username: "abrechnung" -# password: "Mb2.r5oHf-0t" +email: + address: "abrechnung@example.lol" + host: "localhost" + port: 587 + mode: "smtp-starttls" + auth: + username: "abrechnung" + password: "Mb2.r5oHf-0t" diff --git a/debian/build_virtualenv b/debian/build_virtualenv index fcfec2bd..83e9d76c 100755 --- a/debian/build_virtualenv +++ b/debian/build_virtualenv @@ -64,7 +64,7 @@ interest dh-virtualenv-interpreter-update EOF export DESTDIR="debian/abrechnung" -NODE_OPTIONS="--max_old_space_size=4096" && cd frontend && npm install && npx nx build web && cd .. +NODE_OPTIONS="--max_old_space_size=4096" && cd frontend && npm clean-install && npx nx build web && cd .. mkdir -p $DESTDIR/usr/share/ mv frontend/dist/apps/web $DESTDIR/usr/share/abrechnung_web diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json index 234b4257..49cdddb1 100644 --- a/frontend/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -30,13 +30,18 @@ "files": ["*.ts", "*.tsx"], "extends": ["plugin:@nx/typescript"], "rules": { - "@typescript-eslint/no-explicit-any": ["warn"] + "@typescript-eslint/no-explicit-any": ["warn"], + "@typescript-eslint/no-extra-semi": "error", + "no-extra-semi": "off" } }, { "files": ["*.js", "*.jsx"], "extends": ["plugin:@nx/javascript"], - "rules": {} + "rules": { + "@typescript-eslint/no-extra-semi": "error", + "no-extra-semi": "off" + } }, { "files": ["*.jsx", "*.tsx"], diff --git a/frontend/.gitignore b/frontend/.gitignore index 8f49ced9..00f28b52 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -55,6 +55,7 @@ web-build/ apps/mobile-e2e/artifacts .nx/cache +.nx/workspace-data # React Native diff --git a/frontend/.prettierignore b/frontend/.prettierignore index 85f8ece6..daffe92c 100644 --- a/frontend/.prettierignore +++ b/frontend/.prettierignore @@ -3,4 +3,5 @@ /dist /coverage -/.nx/cache \ No newline at end of file +/.nx/cache +/.nx/workspace-data \ No newline at end of file diff --git a/frontend/apps/mobile/android/build.gradle b/frontend/apps/mobile/android/build.gradle index 39985722..4d255568 100644 --- a/frontend/apps/mobile/android/build.gradle +++ b/frontend/apps/mobile/android/build.gradle @@ -2,14 +2,12 @@ buildscript { ext { - buildToolsVersion = "33.0.0" - minSdkVersion = 21 - compileSdkVersion = 33 - targetSdkVersion = 33 - kotlinVersion = "1.8.20" - - // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. - ndkVersion = "23.1.7779620" + buildToolsVersion = "34.0.0" + minSdkVersion = 23 + compileSdkVersion = 34 + targetSdkVersion = 34 + ndkVersion = "26.1.10909125" + kotlinVersion = "1.9.22" } repositories { google() @@ -31,4 +29,4 @@ allprojects { } } -} \ No newline at end of file +} diff --git a/frontend/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties b/frontend/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties index 6ec1567a..7fc84bec 100644 --- a/frontend/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties +++ b/frontend/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/frontend/apps/mobile/android/gradlew b/frontend/apps/mobile/android/gradlew index 65dcd68d..1aa94a42 100755 --- a/frontend/apps/mobile/android/gradlew +++ b/frontend/apps/mobile/android/gradlew @@ -83,10 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/frontend/apps/mobile/android/gradlew.bat b/frontend/apps/mobile/android/gradlew.bat index 93e3f59f..25da30db 100755 --- a/frontend/apps/mobile/android/gradlew.bat +++ b/frontend/apps/mobile/android/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/frontend/apps/mobile/ios/Abrechnung.xcodeproj/project.pbxproj b/frontend/apps/mobile/ios/Abrechnung.xcodeproj/project.pbxproj index f90b6e12..8116faec 100644 --- a/frontend/apps/mobile/ios/Abrechnung.xcodeproj/project.pbxproj +++ b/frontend/apps/mobile/ios/Abrechnung.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Mobile/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Mobile/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Mobile/main.m; sourceTree = ""; }; + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = RnDiffApp/PrivacyInfo.xcprivacy; sourceTree = ""; }; 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Mobile-MobileTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Mobile-MobileTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3B4392A12AC88292D35C810B /* Pods-Mobile.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mobile.debug.xcconfig"; path = "Target Support Files/Pods-Mobile/Pods-Mobile.debug.xcconfig"; sourceTree = ""; }; 5709B34CF0A7D63546082F79 /* Pods-Mobile.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mobile.release.xcconfig"; path = "Target Support Files/Pods-Mobile/Pods-Mobile.release.xcconfig"; sourceTree = ""; }; @@ -92,6 +93,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */, 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, 13B07FB71A68108700A75B9A /* main.m */, + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */, ); name = Mobile; sourceTree = ""; @@ -264,7 +266,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -598,6 +600,8 @@ "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; @@ -663,6 +667,8 @@ "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; diff --git a/frontend/apps/mobile/ios/Abrechnung/AppDelegate.mm b/frontend/apps/mobile/ios/Abrechnung/AppDelegate.mm index c08bf02b..6cb06f6a 100644 --- a/frontend/apps/mobile/ios/Abrechnung/AppDelegate.mm +++ b/frontend/apps/mobile/ios/Abrechnung/AppDelegate.mm @@ -15,6 +15,11 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ + return [self bundleURL]; +} + +- (NSURL *)bundleURL { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"src/main"]; diff --git a/frontend/apps/mobile/ios/Abrechnung/Info.plist b/frontend/apps/mobile/ios/Abrechnung/Info.plist index cee0c8ad..71b7da4f 100644 --- a/frontend/apps/mobile/ios/Abrechnung/Info.plist +++ b/frontend/apps/mobile/ios/Abrechnung/Info.plist @@ -41,7 +41,7 @@ LaunchScreen UIRequiredDeviceCapabilities - armv7 + arm64 UISupportedInterfaceOrientations diff --git a/frontend/apps/mobile/ios/Abrechnung/PrivacyInfo.xcprivacy b/frontend/apps/mobile/ios/Abrechnung/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..ef1896e7 --- /dev/null +++ b/frontend/apps/mobile/ios/Abrechnung/PrivacyInfo.xcprivacy @@ -0,0 +1,38 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyTracking + + + diff --git a/frontend/apps/mobile/ios/Podfile b/frontend/apps/mobile/ios/Podfile index 664bc366..284bfe6a 100644 --- a/frontend/apps/mobile/ios/Podfile +++ b/frontend/apps/mobile/ios/Podfile @@ -8,17 +8,6 @@ require Pod::Executable.execute_command('node', ['-p', platform :ios, min_ios_version_supported prepare_react_native_project! -# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. -# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded -# -# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` -# ```js -# module.exports = { -# dependencies: { -# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), -# ``` -flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled - linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green @@ -28,19 +17,8 @@ end target 'Abrechnung' do config = use_native_modules! - # Flags change depending on the env values. - flags = get_default_flags() - use_react_native!( :path => config[:reactNativePath], - # Hermes is now enabled by default. Disable by setting this flag to false. - :hermes_enabled => flags[:hermes_enabled], - :fabric_enabled => flags[:fabric_enabled], - # Enables Flipper. - # - # Note that if you have use_frameworks! enabled, Flipper will not work and - # you should disable the next line. - :flipper_configuration => flipper_config, # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) @@ -55,8 +33,8 @@ target 'Abrechnung' do react_native_post_install( installer, config[:reactNativePath], - :mac_catalyst_enabled => false + :mac_catalyst_enabled => false, + # :ccache_enabled => true ) - __apply_Xcode_12_5_M1_post_install_workaround(installer) end end diff --git a/frontend/apps/mobile/metro.config.js b/frontend/apps/mobile/metro.config.js index 1de4ca0f..c64423d5 100644 --- a/frontend/apps/mobile/metro.config.js +++ b/frontend/apps/mobile/metro.config.js @@ -7,7 +7,7 @@ const { assetExts, sourceExts } = defaultConfig.resolver; /** * Metro configuration - * https://facebook.github.io/metro/docs/configuration + * https://reactnative.dev/docs/metro * * @type {import('metro-config').MetroConfig} */ diff --git a/frontend/apps/web/src/components/AccountSelect.tsx b/frontend/apps/web/src/components/AccountSelect.tsx index 6e69a470..eea1845f 100644 --- a/frontend/apps/web/src/components/AccountSelect.tsx +++ b/frontend/apps/web/src/components/AccountSelect.tsx @@ -46,7 +46,7 @@ export const AccountSelect: React.FC = ({ options={filteredAccounts} getOptionLabel={(acc: Account) => acc.name} multiple={false} - value={value !== undefined ? accounts.find((acc) => acc.id === value) ?? null : null} + value={value !== undefined ? (accounts.find((acc) => acc.id === value) ?? null) : null} disabled={disabled} openOnFocus fullWidth diff --git a/frontend/apps/web/src/components/accounts/BalanceHistoryGraph.tsx b/frontend/apps/web/src/components/accounts/BalanceHistoryGraph.tsx index ca7e2767..3be2e342 100644 --- a/frontend/apps/web/src/components/accounts/BalanceHistoryGraph.tsx +++ b/frontend/apps/web/src/components/accounts/BalanceHistoryGraph.tsx @@ -63,7 +63,7 @@ export const BalanceHistoryGraph: React.FC = ({ groupId, accountId }) => const graphData: Serie[] = []; let lastPoint = balanceHistory[0]; - const makeSerie = (): Serie => { + const makeSerie = () => { return { id: `serie-${graphData.length}`, data: [], @@ -167,7 +167,7 @@ export const BalanceHistoryGraph: React.FC = ({ groupId, accountId }) => areaBaselineValue={areaBaselineValue} tooltip={renderTooltip} onClick={onClick} - pointLabel={(p) => `${toISODateString(p.x as Date)}: ${p.y}`} + pointLabel={(p) => `${toISODateString(p.data.x as Date)}: ${p.data.y}`} useMesh={true} axisLeft={{ format: (value: number) => `${value.toFixed(2)} ${currency_symbol}`, diff --git a/frontend/apps/web/src/pages/auth/ConfirmEmailChange.tsx b/frontend/apps/web/src/pages/auth/ConfirmEmailChange.tsx index 1b7d5cfa..0ee68a3e 100644 --- a/frontend/apps/web/src/pages/auth/ConfirmEmailChange.tsx +++ b/frontend/apps/web/src/pages/auth/ConfirmEmailChange.tsx @@ -44,7 +44,7 @@ export const ConfirmEmailChange: React.FC = () => { ) : (

- + Click