Merge pull request #113 from donetick/donetick.com-clean
Rebase to Donetick.com branch
3
.gitignore
vendored
@@ -23,4 +23,5 @@ dist-ssr
|
|||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
resources/android/**/*
|
resources/android/**/*
|
||||||
|
resources/ios/**/*
|
||||||
37
android/app/release/output-metadata.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"artifactType": {
|
||||||
|
"type": "APK",
|
||||||
|
"kind": "Directory"
|
||||||
|
},
|
||||||
|
"applicationId": "com.donetick.app",
|
||||||
|
"variantName": "release",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"type": "SINGLE",
|
||||||
|
"filters": [],
|
||||||
|
"attributes": [],
|
||||||
|
"versionCode": 20,
|
||||||
|
"versionName": "1.0.20",
|
||||||
|
"outputFile": "app-release.apk"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"elementType": "File",
|
||||||
|
"baselineProfiles": [
|
||||||
|
{
|
||||||
|
"minApi": 28,
|
||||||
|
"maxApi": 30,
|
||||||
|
"baselineProfiles": [
|
||||||
|
"baselineProfiles/1/app-release.dm"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minApi": 31,
|
||||||
|
"maxApi": 2147483647,
|
||||||
|
"baselineProfiles": [
|
||||||
|
"baselineProfiles/0/app-release.dm"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"minSdkVersionForDexing": 24
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
android:usesCleartextTraffic="true">
|
android:usesCleartextTraffic="true">
|
||||||
<activity
|
<activity
|
||||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:label="@string/title_activity_main"
|
android:label="@string/title_activity_main"
|
||||||
android:theme="@style/AppTheme.NoActionBarLaunch"
|
android:theme="@style/AppTheme.NoActionBarLaunch"
|
||||||
@@ -36,6 +36,16 @@
|
|||||||
android:grantUriPermissions="true">
|
android:grantUriPermissions="true">
|
||||||
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
|
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
|
<!-- Push Notifications Icon -->
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||||
|
android:resource="@mipmap/ic_launcher" />
|
||||||
|
|
||||||
|
<!-- Push Notifications Color -->
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_color"
|
||||||
|
android:resource="@android:color/white" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
<!-- Permissions -->
|
<!-- Permissions -->
|
||||||
@@ -43,6 +53,7 @@
|
|||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -2,4 +2,36 @@ package com.donetick.app;
|
|||||||
|
|
||||||
import com.getcapacitor.BridgeActivity;
|
import com.getcapacitor.BridgeActivity;
|
||||||
|
|
||||||
public class MainActivity extends BridgeActivity {}
|
import ee.forgr.capacitor.social.login.GoogleProvider;
|
||||||
|
import ee.forgr.capacitor.social.login.SocialLoginPlugin;
|
||||||
|
import ee.forgr.capacitor.social.login.ModifiedMainActivityForSocialLoginPlugin;
|
||||||
|
import com.getcapacitor.PluginHandle;
|
||||||
|
import com.getcapacitor.Plugin;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
|
||||||
|
public class MainActivity extends BridgeActivity implements ModifiedMainActivityForSocialLoginPlugin {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
|
||||||
|
if (requestCode >= GoogleProvider.REQUEST_AUTHORIZE_GOOGLE_MIN && requestCode < GoogleProvider.REQUEST_AUTHORIZE_GOOGLE_MAX) {
|
||||||
|
PluginHandle pluginHandle = getBridge().getPlugin("SocialLogin");
|
||||||
|
if (pluginHandle == null) {
|
||||||
|
Log.i("Google Activity Result", "SocialLogin login handle is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Plugin plugin = pluginHandle.getInstance();
|
||||||
|
if (!(plugin instanceof SocialLoginPlugin)) {
|
||||||
|
Log.i("Google Activity Result", "SocialLogin plugin instance is not SocialLoginPlugin");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
((SocialLoginPlugin) plugin).handleGoogleLoginIntent(requestCode, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void IHaveModifiedTheMainActivityForTheUseWithSocialLoginPlugin() {}
|
||||||
|
}
|
||||||
@@ -7,8 +7,8 @@ buildscript {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:8.2.1'
|
classpath 'com.android.tools.build:gradle:8.7.2'
|
||||||
classpath 'com.google.gms:google-services:4.4.0'
|
classpath 'com.google.gms:google-services:4.4.2'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
@@ -5,12 +5,13 @@ ext {
|
|||||||
androidxActivityVersion = '1.9.2'
|
androidxActivityVersion = '1.9.2'
|
||||||
androidxAppCompatVersion = '1.7.0'
|
androidxAppCompatVersion = '1.7.0'
|
||||||
androidxCoordinatorLayoutVersion = '1.2.0'
|
androidxCoordinatorLayoutVersion = '1.2.0'
|
||||||
androidxCoreVersion = '1.12.0'
|
androidxCoreVersion = '1.15.0'
|
||||||
androidxFragmentVersion = '1.6.2'
|
androidxFragmentVersion = '1.8.4'
|
||||||
coreSplashScreenVersion = '1.0.1'
|
coreSplashScreenVersion = '1.0.1'
|
||||||
androidxWebkitVersion = '1.9.0'
|
androidxWebkitVersion = '1.12.1'
|
||||||
junitVersion = '4.13.2'
|
junitVersion = '4.13.2'
|
||||||
androidxJunitVersion = '1.1.5'
|
androidxJunitVersion = '1.2.1'
|
||||||
androidxEspressoCoreVersion = '3.5.1'
|
androidxEspressoCoreVersion = '3.6.1'
|
||||||
cordovaAndroidVersion = '10.1.1'
|
cordovaAndroidVersion = '10.1.1'
|
||||||
|
firebaseMessagingVersion = '24.1.0'
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { CapacitorConfig } from '@capacitor/cli';
|
import type { CapacitorConfig } from '@capacitor/cli'
|
||||||
|
|
||||||
const config: CapacitorConfig = {
|
const config: CapacitorConfig = {
|
||||||
appId: 'com.donetick.app',
|
appId: 'com.donetick.app',
|
||||||
@@ -12,17 +12,17 @@ const config: CapacitorConfig = {
|
|||||||
presentationOptions: ['badge', 'sound', 'alert'],
|
presentationOptions: ['badge', 'sound', 'alert'],
|
||||||
},
|
},
|
||||||
LocalNotifications: {
|
LocalNotifications: {
|
||||||
smallIcon: "ic_stat_icon_config_sample",
|
smallIcon: 'ic_stat_icon_config_sample',
|
||||||
iconColor: "#488AFF",
|
iconColor: '#488AFF',
|
||||||
sound: "beep.wav",
|
sound: 'beep.wav',
|
||||||
},
|
},
|
||||||
GoogleAuth: {
|
// GoogleAuth: {
|
||||||
scopes: ['profile', 'email', 'openid'],
|
// scopes: ['profile', 'email', 'openid'],
|
||||||
clientId: process.env.VITE_APP_GOOGLE_CLIENT_ID,
|
// clientId: process.env.VITE_APP_GOOGLE_CLIENT_ID,
|
||||||
androidClientId: process.env.VITE_APP_ANDRIOD_CLIENT_ID,
|
// androidClientId: process.env.VITE_APP_ANDRIOD_CLIENT_ID,
|
||||||
iosClientId: process.env.VITE_APP_IOS_CLIENT_ID,
|
// iosClientId: process.env.VITE_APP_IOS_CLIENT_ID,
|
||||||
|
// },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export default config;
|
export default config
|
||||||
|
|||||||
13
index.html
@@ -1,10 +1,21 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
|
<script
|
||||||
|
defer
|
||||||
|
data-domain="donetick.com"
|
||||||
|
src="https://collector.wannaknow.link/js/script.js"
|
||||||
|
></script>
|
||||||
|
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<!-- <link rel="icon" type="image/svg+xml" href="/logo.svg" /> -->
|
<!-- <link rel="icon" type="image/svg+xml" href="/logo.svg" /> -->
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||||
|
/>
|
||||||
|
|
||||||
<title>Donetick</title>
|
<title>Donetick</title>
|
||||||
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; };
|
504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; };
|
||||||
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; };
|
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; };
|
||||||
50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; };
|
50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; };
|
||||||
|
72FA9293C4A649D1BA0E5917 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 71866EB277374608AD02C137 /* PrivacyInfo.xcprivacy */; };
|
||||||
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; };
|
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; };
|
||||||
D1115B492C653D60004C6043 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D1115B482C653D60004C6043 /* GoogleService-Info.plist */; };
|
D1115B492C653D60004C6043 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D1115B482C653D60004C6043 /* GoogleService-Info.plist */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
@@ -28,6 +29,7 @@
|
|||||||
504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; };
|
50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; };
|
||||||
|
71866EB277374608AD02C137 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||||
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; };
|
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
D1115B482C653D60004C6043 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
|
D1115B482C653D60004C6043 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
|
||||||
@@ -62,6 +64,7 @@
|
|||||||
504EC3051FED79650016851F /* Products */,
|
504EC3051FED79650016851F /* Products */,
|
||||||
7F8756D8B27F46E3366F6CEA /* Pods */,
|
7F8756D8B27F46E3366F6CEA /* Pods */,
|
||||||
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */,
|
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */,
|
||||||
|
71866EB277374608AD02C137 /* PrivacyInfo.xcprivacy */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@@ -127,8 +130,8 @@
|
|||||||
504EC2FC1FED79650016851F /* Project object */ = {
|
504EC2FC1FED79650016851F /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastSwiftUpdateCheck = 0920;
|
LastSwiftUpdateCheck = 920;
|
||||||
LastUpgradeCheck = 0920;
|
LastUpgradeCheck = 920;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
504EC3031FED79650016851F = {
|
504EC3031FED79650016851F = {
|
||||||
CreatedOnToolsVersion = 9.2;
|
CreatedOnToolsVersion = 9.2;
|
||||||
@@ -169,6 +172,7 @@
|
|||||||
504EC30D1FED79650016851F /* Main.storyboard in Resources */,
|
504EC30D1FED79650016851F /* Main.storyboard in Resources */,
|
||||||
2FAD9763203C412B000D30F8 /* config.xml in Resources */,
|
2FAD9763203C412B000D30F8 /* config.xml in Resources */,
|
||||||
D1115B492C653D60004C6043 /* GoogleService-Info.plist in Resources */,
|
D1115B492C653D60004C6043 /* GoogleService-Info.plist in Resources */,
|
||||||
|
72FA9293C4A649D1BA0E5917 /* PrivacyInfo.xcprivacy in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -289,7 +293,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
@@ -340,7 +344,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||||
@@ -358,7 +362,7 @@
|
|||||||
CURRENT_PROJECT_VERSION = 24;
|
CURRENT_PROJECT_VERSION = 24;
|
||||||
DEVELOPMENT_TEAM = 6UJJ78R3BS;
|
DEVELOPMENT_TEAM = 6UJJ78R3BS;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.donetick.app;
|
PRODUCT_BUNDLE_IDENTIFIER = com.donetick.app;
|
||||||
MARKETING_VERSION = 1.2.2;
|
MARKETING_VERSION = 1.2.2;
|
||||||
@@ -378,7 +382,7 @@
|
|||||||
CURRENT_PROJECT_VERSION = 24;
|
CURRENT_PROJECT_VERSION = 24;
|
||||||
DEVELOPMENT_TEAM = 6UJJ78R3BS;
|
DEVELOPMENT_TEAM = 6UJJ78R3BS;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 1.2.2;
|
MARKETING_VERSION = 1.2.2;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.donetick.app;
|
PRODUCT_BUNDLE_IDENTIFIER = com.donetick.app;
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 53 KiB |
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename" : "AppIcon-512@2x.png",
|
"idiom": "universal",
|
||||||
"idiom" : "universal",
|
"size": "1024x1024",
|
||||||
"platform" : "ios",
|
"filename": "AppIcon-512@2x.png",
|
||||||
"size" : "1024x1024"
|
"platform": "ios"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info": {
|
||||||
"author" : "xcode",
|
"author": "xcode",
|
||||||
"version" : 1
|
"version": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,23 +1,56 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images": [
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom": "universal",
|
||||||
"filename" : "splash-2732x2732-2.png",
|
"filename": "Default@1x~universal~anyany.png",
|
||||||
"scale" : "1x"
|
"scale": "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom": "universal",
|
||||||
"filename" : "splash-2732x2732-1.png",
|
"filename": "Default@2x~universal~anyany.png",
|
||||||
"scale" : "2x"
|
"scale": "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom": "universal",
|
||||||
"filename" : "splash-2732x2732.png",
|
"filename": "Default@3x~universal~anyany.png",
|
||||||
"scale" : "3x"
|
"scale": "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances": [
|
||||||
|
{
|
||||||
|
"appearance": "luminosity",
|
||||||
|
"value": "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom": "universal",
|
||||||
|
"scale": "1x",
|
||||||
|
"filename": "Default@1x~universal~anyany-dark.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances": [
|
||||||
|
{
|
||||||
|
"appearance": "luminosity",
|
||||||
|
"value": "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom": "universal",
|
||||||
|
"scale": "2x",
|
||||||
|
"filename": "Default@2x~universal~anyany-dark.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances": [
|
||||||
|
{
|
||||||
|
"appearance": "luminosity",
|
||||||
|
"value": "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom": "universal",
|
||||||
|
"scale": "3x",
|
||||||
|
"filename": "Default@3x~universal~anyany-dark.png"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info": {
|
||||||
"version" : 1,
|
"version": 1,
|
||||||
"author" : "xcode"
|
"author": "xcode"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png
vendored
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png
vendored
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png
vendored
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png
vendored
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png
vendored
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png
vendored
Normal file
|
After Width: | Height: | Size: 52 KiB |
@@ -5,7 +5,7 @@
|
|||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>en</string>
|
<string>en</string>
|
||||||
<key>CFBundleDisplayName</key>
|
<key>CFBundleDisplayName</key>
|
||||||
<string>DoneTick</string>
|
<string>Donetick</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
@@ -18,10 +18,27 @@
|
|||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>$(MARKETING_VERSION)</string>
|
<string>$(MARKETING_VERSION)</string>
|
||||||
|
<key>CFBundleURLTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleURLSchemes</key>
|
||||||
|
<array>
|
||||||
|
<string>com.googleusercontent.apps.682262497914-5dacpk46qcc1494lood6ch8ul9c83kop</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>NSCameraUsageDescription</key>
|
||||||
|
<string>This app needs access to camera to take photos to attach to task or use as profile photo</string>
|
||||||
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
|
<string>This app needs access to photo library to select images to attach to task or use as profile photo</string>
|
||||||
|
<key>UIBackgroundModes</key>
|
||||||
|
<array/>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>UIMainStoryboardFile</key>
|
||||||
<string>Main</string>
|
<string>Main</string>
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
@@ -30,6 +47,7 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
<array>
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
@@ -54,9 +72,5 @@
|
|||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>NSCameraUsageDescription</key>
|
|
||||||
<string>This app needs access to camera to take photos to attach to task or use as profile photo</string>
|
|
||||||
<key>NSPhotoLibraryUsageDescription</key>
|
|
||||||
<string>This app needs access to photo library to select images to attach to task or use as profile photo</string>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ PODS:
|
|||||||
- SQLCipher/common (4.10.0)
|
- SQLCipher/common (4.10.0)
|
||||||
- SQLCipher/standard (4.10.0):
|
- SQLCipher/standard (4.10.0):
|
||||||
- SQLCipher/common
|
- SQLCipher/common
|
||||||
- ZIPFoundation (0.9.19)
|
- ZIPFoundation (0.9.20)
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- "Capacitor (from `../../node_modules/@capacitor/ios`)"
|
- "Capacitor (from `../../node_modules/@capacitor/ios`)"
|
||||||
@@ -248,7 +248,7 @@ SPEC CHECKSUMS:
|
|||||||
RevenuecatPurchasesCapacitorUi: 267758d61aba42a0a3f035e6ba3c4630112357e4
|
RevenuecatPurchasesCapacitorUi: 267758d61aba42a0a3f035e6ba3c4630112357e4
|
||||||
RevenueCatUI: 3c72ef61b54c3f4787afab6a3b0f00cbec192063
|
RevenueCatUI: 3c72ef61b54c3f4787afab6a3b0f00cbec192063
|
||||||
SQLCipher: eb79c64049cb002b4e9fcb30edb7979bf4706dfc
|
SQLCipher: eb79c64049cb002b4e9fcb30edb7979bf4706dfc
|
||||||
ZIPFoundation: b8c29ea7ae353b309bc810586181fd073cb3312c
|
ZIPFoundation: dfd3d681c4053ff7e2f7350bc4e53b5dba3f5351
|
||||||
|
|
||||||
PODFILE CHECKSUM: bb6dcef70c8edc058fe3ba311f08a223fd7dbc66
|
PODFILE CHECKSUM: bb6dcef70c8edc058fe3ba311f08a223fd7dbc66
|
||||||
|
|
||||||
|
|||||||
29
ios/App/PrivacyInfo.xcprivacy
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>85F4.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>CA92.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
0
ios/Podfile
Normal file
2203
package-lock.json
generated
@@ -30,6 +30,7 @@
|
|||||||
"ionic:build": "npm run build",
|
"ionic:build": "npm run build",
|
||||||
"ionic:serve": "npm run start",
|
"ionic:serve": "npm run start",
|
||||||
"android": "npm run build && npx cap sync android",
|
"android": "npm run build && npx cap sync android",
|
||||||
|
"cap": "npm run build && npx cap sync",
|
||||||
"bump": "node bump-version.js",
|
"bump": "node bump-version.js",
|
||||||
"bump:minor": "node bump-version.js minor",
|
"bump:minor": "node bump-version.js minor",
|
||||||
"bump:major": "node bump-version.js major"
|
"bump:major": "node bump-version.js major"
|
||||||
@@ -104,6 +105,7 @@
|
|||||||
"@vitejs/plugin-react-swc": "^3.5.0",
|
"@vitejs/plugin-react-swc": "^3.5.0",
|
||||||
"autoprefixer": "^10.4.16",
|
"autoprefixer": "^10.4.16",
|
||||||
"baseline-browser-mapping": "^2.9.19",
|
"baseline-browser-mapping": "^2.9.19",
|
||||||
|
"capacitor-set-version": "^2.2.0",
|
||||||
"eslint": "^8.56.0",
|
"eslint": "^8.56.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-prettier": "^5.1.2",
|
"eslint-plugin-prettier": "^5.1.2",
|
||||||
|
|||||||
29
src/App.jsx
@@ -1,14 +1,18 @@
|
|||||||
import NavBar from '@/views/components/NavBar'
|
import NavBar from '@/views/components/NavBar'
|
||||||
import { Button, Typography, useColorScheme } from '@mui/joy'
|
import { Button, Typography, useColorScheme } from '@mui/joy'
|
||||||
import Tracker from '@openreplay/tracker'
|
|
||||||
import { useCallback, useEffect } from 'react'
|
import { useCallback, useEffect } from 'react'
|
||||||
import { Outlet } from 'react-router-dom'
|
import { Outlet } from 'react-router-dom'
|
||||||
import { useRegisterSW } from 'virtual:pwa-register/react'
|
import { useRegisterSW } from 'virtual:pwa-register/react'
|
||||||
import { registerCapacitorListeners } from './CapacitorListener'
|
import { registerCapacitorListeners } from './CapacitorListener'
|
||||||
import PageTransition from './components/animations/PageTransition'
|
import PageTransition from './components/animations/PageTransition'
|
||||||
import { ImpersonateUserProvider } from './contexts/ImpersonateUserContext'
|
import { ImpersonateUserProvider } from './contexts/ImpersonateUserContext'
|
||||||
import SSEProvider from './contexts/SSEContext'
|
|
||||||
import { AuthProvider } from './hooks/useAuth.jsx'
|
import { AuthProvider } from './hooks/useAuth.jsx'
|
||||||
|
|
||||||
|
import useStatusBar from './hooks/useStatusBar'
|
||||||
|
import { useResource } from './queries/ResourceQueries'
|
||||||
|
import './styles/safe-area.css'
|
||||||
|
|
||||||
|
import SSEProvider from './contexts/SSEContext'
|
||||||
import { useNotification } from './service/NotificationProvider'
|
import { useNotification } from './service/NotificationProvider'
|
||||||
|
|
||||||
import NetworkBanner from './views/components/NetworkBanner'
|
import NetworkBanner from './views/components/NetworkBanner'
|
||||||
@@ -24,18 +28,14 @@ const remove = className => {
|
|||||||
// TODO: Update the interval to at 60 minutes
|
// TODO: Update the interval to at 60 minutes
|
||||||
const intervalMS = 5 * 60 * 1000 // 5 minutes
|
const intervalMS = 5 * 60 * 1000 // 5 minutes
|
||||||
|
|
||||||
const startOpenReplay = () => {
|
|
||||||
if (!import.meta.env.VITE_OPENREPLAY_PROJECT_KEY) return
|
|
||||||
const tracker = new Tracker({
|
|
||||||
projectKey: import.meta.env.VITE_OPENREPLAY_PROJECT_KEY,
|
|
||||||
})
|
|
||||||
tracker.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
const AppContent = () => {
|
const AppContent = () => {
|
||||||
const { showNotification } = useNotification()
|
const { showNotification } = useNotification()
|
||||||
|
|
||||||
|
// Initialize status bar with theme-aware configuration
|
||||||
|
useStatusBar()
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
offlineReady: [offlineReady, setOfflineReady], // eslint-disable-line no-unused-vars
|
||||||
needRefresh: [needRefresh, setNeedRefresh],
|
needRefresh: [needRefresh, setNeedRefresh],
|
||||||
updateServiceWorker,
|
updateServiceWorker,
|
||||||
} = useRegisterSW({
|
} = useRegisterSW({
|
||||||
@@ -94,10 +94,11 @@ const AppContent = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
// startOpenReplay()
|
const resource = useResource() // eslint-disable-line no-unused-vars
|
||||||
|
|
||||||
const { mode, systemMode } = useColorScheme()
|
const { mode, systemMode } = useColorScheme()
|
||||||
|
|
||||||
|
// startOpenReplay()
|
||||||
|
|
||||||
const setThemeClass = useCallback(() => {
|
const setThemeClass = useCallback(() => {
|
||||||
const value = JSON.parse(localStorage.getItem('themeMode')) || mode
|
const value = JSON.parse(localStorage.getItem('themeMode')) || mode
|
||||||
|
|
||||||
@@ -124,7 +125,7 @@ function App() {
|
|||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<div>
|
||||||
<NetworkBanner />
|
<NetworkBanner />
|
||||||
|
|
||||||
<AuthProvider>
|
<AuthProvider>
|
||||||
@@ -132,7 +133,7 @@ function App() {
|
|||||||
<AppContent />
|
<AppContent />
|
||||||
</SSEProvider>
|
</SSEProvider>
|
||||||
</AuthProvider>
|
</AuthProvider>
|
||||||
</>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
56
src/hooks/useStatusBar.js
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import { useColorScheme } from '@mui/joy'
|
||||||
|
import { useEffect } from 'react'
|
||||||
|
import statusBarManager from '../utils/StatusBarManager'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom hook to manage status bar integration with Joy UI themes
|
||||||
|
* This hook automatically syncs the status bar style with the current theme
|
||||||
|
*/
|
||||||
|
export const useStatusBar = () => {
|
||||||
|
const { mode, systemMode } = useColorScheme()
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// Initialize status bar on mount
|
||||||
|
const initializeStatusBar = async () => {
|
||||||
|
await statusBarManager.initialize(mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
initializeStatusBar()
|
||||||
|
|
||||||
|
// Cleanup on unmount
|
||||||
|
return () => {
|
||||||
|
statusBarManager.cleanup()
|
||||||
|
}
|
||||||
|
}, [mode]) // Include mode dependency
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// Update status bar when theme changes
|
||||||
|
const updateStatusBarTheme = async () => {
|
||||||
|
let resolvedTheme = mode
|
||||||
|
|
||||||
|
// Handle system mode by using the detected system theme
|
||||||
|
if (mode === 'system') {
|
||||||
|
resolvedTheme = systemMode || 'light'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the status bar with the resolved theme
|
||||||
|
await statusBarManager.updateResolvedTheme(resolvedTheme)
|
||||||
|
|
||||||
|
// Also update the base theme for future reference
|
||||||
|
await statusBarManager.setTheme(mode)
|
||||||
|
|
||||||
|
// Notify any custom listeners
|
||||||
|
statusBarManager.notifyThemeChange(resolvedTheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
updateStatusBarTheme()
|
||||||
|
}, [mode, systemMode]) // Update when either mode or systemMode changes
|
||||||
|
|
||||||
|
return {
|
||||||
|
statusBarManager,
|
||||||
|
currentTheme: mode,
|
||||||
|
resolvedTheme: mode === 'system' ? systemMode : mode,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useStatusBar
|
||||||
127
src/styles/safe-area.css
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Safe Area CSS Utilities
|
||||||
|
* These utilities provide consistent safe area handling across the app
|
||||||
|
* using CSS custom properties set by StatusBarManager
|
||||||
|
*/
|
||||||
|
|
||||||
|
:root {
|
||||||
|
/* Fallback values for safe area insets when not on native platforms */
|
||||||
|
--safe-area-inset-top: 0px;
|
||||||
|
--safe-area-inset-right: 0px;
|
||||||
|
--safe-area-inset-bottom: 0px;
|
||||||
|
--safe-area-inset-left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Utility classes for safe area handling */
|
||||||
|
.safe-area-top {
|
||||||
|
padding-top: var(--safe-area-inset-top);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-area-right {
|
||||||
|
padding-right: var(--safe-area-inset-right);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-area-bottom {
|
||||||
|
padding-bottom: var(--safe-area-inset-bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-area-left {
|
||||||
|
padding-left: var(--safe-area-inset-left);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-area-x {
|
||||||
|
padding-left: var(--safe-area-inset-left);
|
||||||
|
padding-right: var(--safe-area-inset-right);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-area-y {
|
||||||
|
padding-top: var(--safe-area-inset-top);
|
||||||
|
padding-bottom: var(--safe-area-inset-bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-area-all {
|
||||||
|
padding-top: var(--safe-area-inset-top);
|
||||||
|
padding-right: var(--safe-area-inset-right);
|
||||||
|
padding-bottom: var(--safe-area-inset-bottom);
|
||||||
|
padding-left: var(--safe-area-inset-left);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Margin variants */
|
||||||
|
.safe-margin-top {
|
||||||
|
margin-top: var(--safe-area-inset-top);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-margin-right {
|
||||||
|
margin-right: var(--safe-area-inset-right);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-margin-bottom {
|
||||||
|
margin-bottom: var(--safe-area-inset-bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-margin-left {
|
||||||
|
margin-left: var(--safe-area-inset-left);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-margin-x {
|
||||||
|
margin-left: var(--safe-area-inset-left);
|
||||||
|
margin-right: var(--safe-area-inset-right);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-margin-y {
|
||||||
|
margin-top: var(--safe-area-inset-top);
|
||||||
|
margin-bottom: var(--safe-area-inset-bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
.safe-margin-all {
|
||||||
|
margin-top: var(--safe-area-inset-top);
|
||||||
|
margin-right: var(--safe-area-inset-right);
|
||||||
|
margin-bottom: var(--safe-area-inset-bottom);
|
||||||
|
margin-left: var(--safe-area-inset-left);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Height utilities that account for safe areas */
|
||||||
|
.min-h-screen-safe {
|
||||||
|
min-height: calc(100vh - var(--safe-area-inset-top) - var(--safe-area-inset-bottom));
|
||||||
|
}
|
||||||
|
|
||||||
|
.h-screen-safe {
|
||||||
|
height: calc(100vh - var(--safe-area-inset-top) - var(--safe-area-inset-bottom));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Top positioning that accounts for safe area */
|
||||||
|
.top-safe {
|
||||||
|
top: var(--safe-area-inset-top);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bottom positioning that accounts for safe area */
|
||||||
|
.bottom-safe {
|
||||||
|
bottom: var(--safe-area-inset-bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fixed positioning utilities that respect safe areas */
|
||||||
|
.fixed-top-safe {
|
||||||
|
position: fixed;
|
||||||
|
top: var(--safe-area-inset-top);
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 1030;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fixed-bottom-safe {
|
||||||
|
position: fixed;
|
||||||
|
bottom: var(--safe-area-inset-bottom);
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 1030;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Container that provides full safe area coverage */
|
||||||
|
.container-safe {
|
||||||
|
padding-top: var(--safe-area-inset-top);
|
||||||
|
padding-right: var(--safe-area-inset-right);
|
||||||
|
padding-bottom: var(--safe-area-inset-bottom);
|
||||||
|
padding-left: var(--safe-area-inset-left);
|
||||||
|
min-height: 100vh;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@ class StatusBarManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Configure basic status bar settings - use overlay: true for precise control
|
// Configure basic status bar settings
|
||||||
await StatusBar.setOverlaysWebView({ overlay: false })
|
await StatusBar.setOverlaysWebView({ overlay: false })
|
||||||
await StatusBar.show()
|
await StatusBar.show()
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,18 @@
|
|||||||
import { Card, Grid, Typography } from '@mui/joy'
|
import { Card, Grid, Typography } from '@mui/joy'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
|
import { useState } from 'react'
|
||||||
import ChoreCard from '../Chores/ChoreCard'
|
import ChoreCard from '../Chores/ChoreCard'
|
||||||
|
|
||||||
const DemoMyChore = () => {
|
const DemoMyChore = () => {
|
||||||
|
const [selectedCalendarDate, setSelectedCalendarDate] = useState(null)
|
||||||
|
|
||||||
const cards = [
|
const cards = [
|
||||||
{
|
{
|
||||||
id: 12,
|
id: 12,
|
||||||
name: '♻️ Take out recycle ',
|
name: '♻️ Take out recycle ',
|
||||||
frequencyType: 'days_of_the_week',
|
frequencyType: 'days_of_the_week',
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
|
priority: 1,
|
||||||
frequencyMetadata:
|
frequencyMetadata:
|
||||||
'{"days":["thursday"],"time":"2024-07-07T22:00:00-04:00"}',
|
'{"days":["thursday"],"time":"2024-07-07T22:00:00-04:00"}',
|
||||||
nextDueDate: moment().add(1, 'days').hour(8).minute(0).toISOString(),
|
nextDueDate: moment().add(1, 'days').hour(8).minute(0).toISOString(),
|
||||||
@@ -96,6 +100,17 @@ const DemoMyChore = () => {
|
|||||||
]
|
]
|
||||||
|
|
||||||
const users = [{ displayName: 'Me', id: 1, userId: 1 }]
|
const users = [{ displayName: 'Me', id: 1, userId: 1 }]
|
||||||
|
|
||||||
|
// Helper function to get chores for a specific date
|
||||||
|
const getChoresForDate = date => {
|
||||||
|
return cards.filter(chore => {
|
||||||
|
if (!chore.nextDueDate) return false
|
||||||
|
const choreDate = new Date(chore.nextDueDate).toLocaleDateString()
|
||||||
|
const selectedDate = date.toLocaleDateString()
|
||||||
|
return choreDate === selectedDate
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Grid item xs={12} sm={5} data-aos-first-tasks-list>
|
<Grid item xs={12} sm={5} data-aos-first-tasks-list>
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ import TabletInstallationSection from './TabletInstallationSection'
|
|||||||
const Landing = () => {
|
const Landing = () => {
|
||||||
const Navigate = useNavigate()
|
const Navigate = useNavigate()
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
// if the host is https://app.donetick.com/ then redirect to https://app.donetick.com/my/chores:
|
||||||
|
if (window.location.host === 'app.donetick.com') {
|
||||||
|
Navigate('/chores')
|
||||||
|
}
|
||||||
AOS.init({
|
AOS.init({
|
||||||
once: false, // whether animation should happen only once - while scrolling down
|
once: false, // whether animation should happen only once - while scrolling down
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import ipad_screenshot from '@/assets/ipad_dashbard_calendar.png'
|
import ipad_screenshot from '@/assets/ipad_dashbard_calendar.png'
|
||||||
import { Box, Container, Typography } from '@mui/joy'
|
import { Box, Container, Typography } from '@mui/joy'
|
||||||
|
|
||||||
const TabletInstallationSection = () => {
|
const TabletInstallationSection = () => {
|
||||||
return (
|
return (
|
||||||
<Container maxWidth='xl' sx={{ py: { xs: 6, sm: 8, md: 12 } }}>
|
<Container maxWidth='xl' sx={{ py: { xs: 6, sm: 8, md: 12 } }}>
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
|
|
||||||
const PrivacyPolicyView = () => {
|
const PrivacyPolicyView = () => {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -29,7 +29,10 @@ const AccountSettings = () => {
|
|||||||
async function configurePurchases() {
|
async function configurePurchases() {
|
||||||
if (Capacitor.isNativePlatform() && userProfile) {
|
if (Capacitor.isNativePlatform() && userProfile) {
|
||||||
await Purchases.configure({
|
await Purchases.configure({
|
||||||
apiKey: import.meta.env.VITE_REACT_APP_REVENUECAT_API_KEY,
|
apiKey:
|
||||||
|
Capacitor.getPlatform() === 'ios'
|
||||||
|
? import.meta.env.VITE_REACT_APP_REVENUECAT_API_KEY_IOS
|
||||||
|
: import.meta.env.VITE_REACT_APP_REVENUECAT_API_KEY_ANDROID,
|
||||||
appUserID: String(userProfile?.id),
|
appUserID: String(userProfile?.id),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,7 +139,10 @@ const Settings = () => {
|
|||||||
async function configurePurchases() {
|
async function configurePurchases() {
|
||||||
if (Capacitor.isNativePlatform() && userProfile) {
|
if (Capacitor.isNativePlatform() && userProfile) {
|
||||||
await Purchases.configure({
|
await Purchases.configure({
|
||||||
apiKey: import.meta.env.VITE_REACT_APP_REVENUECAT_API_KEY,
|
apiKey:
|
||||||
|
Capacitor.getPlatform() === 'ios'
|
||||||
|
? import.meta.env.VITE_REACT_APP_REVENUECAT_API_KEY_IOS
|
||||||
|
: import.meta.env.VITE_REACT_APP_REVENUECAT_API_KEY_ANDROID,
|
||||||
appUserID: String(userProfile?.id),
|
appUserID: String(userProfile?.id),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -221,7 +221,7 @@ const NavBar = () => {
|
|||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div>
|
<div className='drawer-content'>
|
||||||
{/* <div className='align-center flex px-5 pt-4'>
|
{/* <div className='align-center flex px-5 pt-4'>
|
||||||
<ModalClose size='sm' sx={{ top: 'unset', right: 20 }} />
|
<ModalClose size='sm' sx={{ top: 'unset', right: 20 }} />
|
||||||
</div> */}
|
</div> */}
|
||||||
|
|||||||