diff --git a/android/app/build.gradle b/android/app/build.gradle
index d8c3525dd..cfa62bf72 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -13,8 +13,8 @@ android {
applicationId "com.remoteit"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 286
- versionName "3.40.2"
+ versionCode 287
+ versionName "3.41.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
diff --git a/android/build.gradle b/android/build.gradle
index 4bd6375d9..670d4e0b8 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -7,7 +7,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:8.12.1'
+ classpath 'com.android.tools.build:gradle:8.13.0'
classpath 'com.google.gms:google-services:4.4.0'
// NOTE: Do not place your application dependencies here; they belong
diff --git a/electron/package-lock.json b/electron/package-lock.json
index ff543d3ba..f09e63539 100644
--- a/electron/package-lock.json
+++ b/electron/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "remoteit",
- "version": "3.40.2",
+ "version": "3.41.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "remoteit",
- "version": "3.40.2",
+ "version": "3.41.0",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
diff --git a/electron/package.json b/electron/package.json
index a809b7573..4cc2d6ea5 100644
--- a/electron/package.json
+++ b/electron/package.json
@@ -1,6 +1,6 @@
{
"name": "remoteit",
- "version": "3.40.2",
+ "version": "3.41.0",
"private": true,
"main": "build/index.js",
"description": "Remote.It cross platform desktop application for creating and hosting connections",
@@ -169,4 +169,4 @@
"build/**/*"
]
}
-}
\ No newline at end of file
+}
diff --git a/frontend/package.json b/frontend/package.json
index 349e39e91..2fa79f95c 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "remoteit-desktop-frontend",
- "version": "3.40.2",
+ "version": "3.41.0",
"private": true,
"type": "module",
"scripts": {
diff --git a/frontend/src/components/AvatarMenu.tsx b/frontend/src/components/AvatarMenu.tsx
index 14a5dd351..dd6f43280 100644
--- a/frontend/src/components/AvatarMenu.tsx
+++ b/frontend/src/components/AvatarMenu.tsx
@@ -98,9 +98,7 @@ export const AvatarMenu: React.FC = () => {
to="/account"
badge={licenseIndicator}
onClick={handleClose}
- >
- {browser.isAndroid && }
-
+ />
= ({ device }) => {
await dispatch.logs.fetch({ allowedDays, deviceId: device?.id })
}
- const showPlanUpgradeNotice = Boolean(planUpgrade && !fetching && !fetchingMore && !browser.isAndroid)
+ const showPlanUpgradeNotice = Boolean(planUpgrade && !fetching && !fetchingMore)
return (
<>
@@ -41,9 +41,11 @@ export const EventList: React.FC = ({ device }) => {
- Upgrade
-
+
+
+
}
>
Plan upgrade required to view logs past {humanizeDays(logLimit?.value)}.
diff --git a/frontend/src/components/SidebarNav.tsx b/frontend/src/components/SidebarNav.tsx
index 30abc5d74..99305124a 100644
--- a/frontend/src/components/SidebarNav.tsx
+++ b/frontend/src/components/SidebarNav.tsx
@@ -110,9 +110,7 @@ export const SidebarNav: React.FC = () => {
icon="scripting"
match={['/script', '/scripts', '/runs']}
dense
- >
-
-
+ />
setMore(!more)} sx={{ marginTop: 2 }}>
diff --git a/frontend/src/models/logs.ts b/frontend/src/models/logs.ts
index 1554f8ba4..f8d408f15 100644
--- a/frontend/src/models/logs.ts
+++ b/frontend/src/models/logs.ts
@@ -5,33 +5,6 @@ import { RootModel } from '.'
const DAY_MS = 24 * 60 * 60 * 1000
-const toTimestamp = (value?: Date | string) => (value ? new Date(value).getTime() : undefined)
-
-const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max)
-
-const evaluateRetention = ({
- items,
- minDate,
- hasMore,
- allowedDays,
-}: {
- items: IEvent[]
- minDate?: Date
- hasMore?: boolean
- allowedDays: number
-}) => {
- const minDateMs = toTimestamp(minDate)
- const oldestMs = toTimestamp(items[items.length - 1]?.timestamp)
- const boundaryReady = Boolean(items.length && !hasMore && minDateMs !== undefined && oldestMs !== undefined)
- if (!boundaryReady) return { reached: false, near: false }
-
- const reached = oldestMs! <= minDateMs!
- const thresholdDays = clamp(allowedDays > 0 ? allowedDays * 0.1 : 1, 0.25, 1)
- const near = !reached && oldestMs! - minDateMs! <= thresholdDays * DAY_MS
-
- return { reached, near }
-}
-
type ILogState = {
size: number
after?: string
@@ -93,18 +66,16 @@ export default createModel()({
items: mergedItems,
}
- const { reached, near } = evaluateRetention({
- items: mergedItems,
- minDate,
- hasMore: nextEvents.hasMore,
- allowedDays,
- })
+ const hasReachedLimit = !nextEvents.hasMore && allowedDays > 0
+ const firstLogMs = state.user.created?.getTime() || 0
+ const logLimitMs = Date.now() - allowedDays * DAY_MS
+ const planUpgrade = hasReachedLimit && firstLogMs < logLimitMs
set({
events: nextEvents,
fetching: false,
fetchingMore: false,
- planUpgrade: reached || near,
+ planUpgrade,
})
},
diff --git a/frontend/src/pages/AccountPage.tsx b/frontend/src/pages/AccountPage.tsx
index c003688c1..71445c0a6 100644
--- a/frontend/src/pages/AccountPage.tsx
+++ b/frontend/src/pages/AccountPage.tsx
@@ -4,6 +4,7 @@ import { List, Typography, Tooltip, ButtonBase } from '@mui/material'
import { ListItemLocation } from '../components/ListItemLocation'
import { windowOpen } from '../services/browser'
import { Container } from '../components/Container'
+import { MobileUI } from '../components/MobileUI'
import { Logo } from '@common/brand/Logo'
import { Icon } from '../components/Icon'
@@ -33,12 +34,14 @@ export const AccountPage: React.FC = () => {
dense
/>
-
- {!browser.hasBilling && }
-
-
- {!browser.hasBilling && }
-
+
+
+ {!browser.hasBilling && }
+
+
+ {!browser.hasBilling && }
+
+
diff --git a/frontend/src/routers/Router.tsx b/frontend/src/routers/Router.tsx
index 8836b52ea..b85350d8d 100644
--- a/frontend/src/routers/Router.tsx
+++ b/frontend/src/routers/Router.tsx
@@ -346,39 +346,37 @@ export const Router: React.FC<{ layout: ILayout }> = ({ layout }) => {
{/* Account */}
-
- }
- secondary={
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
- layout={layout}
- root="/account"
- />
-
+ }
+ secondary={
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ layout={layout}
+ root="/account"
+ />
{/* Not found */}
diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj
index 8755f7932..1f4ab7ed4 100644
--- a/ios/App/App.xcodeproj/project.pbxproj
+++ b/ios/App/App.xcodeproj/project.pbxproj
@@ -352,7 +352,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = 139;
+ CURRENT_PROJECT_VERSION = 140;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NR6A6NQAYW;
INFOPLIST_FILE = App/Info.plist;
@@ -360,7 +360,7 @@
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 3.40.2;
+ MARKETING_VERSION = 3.41.0;
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = com.remoteit.mobile.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -381,7 +381,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
- CURRENT_PROJECT_VERSION = 139;
+ CURRENT_PROJECT_VERSION = 140;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NR6A6NQAYW;
INFOPLIST_FILE = App/Info.plist;
@@ -389,7 +389,7 @@
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 3.40.2;
+ MARKETING_VERSION = 3.41.0;
PRODUCT_BUNDLE_IDENTIFIER = com.remoteit.mobile.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
diff --git a/package-lock.json b/package-lock.json
index 559ea34f3..3e8aef2b5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "remoteit-capacitor",
- "version": "3.40.2",
+ "version": "3.41.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "remoteit-capacitor",
- "version": "3.40.2",
+ "version": "3.41.0",
"hasInstallScript": true,
"workspaces": [
"electron",
@@ -40,7 +40,7 @@
},
"electron": {
"name": "remoteit",
- "version": "3.40.2",
+ "version": "3.41.0",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@@ -164,7 +164,7 @@
},
"frontend": {
"name": "remoteit-desktop-frontend",
- "version": "3.40.2",
+ "version": "3.41.0",
"dependencies": {
"@airbrake/browser": "^2.1.9",
"@aws-amplify/auth": "^5.6.6",
diff --git a/package.json b/package.json
index 1726dd521..fa4c6c92d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "remoteit-capacitor",
- "version": "3.40.2",
+ "version": "3.41.0",
"private": true,
"description": "Remote.It cross platform desktop application for creating and hosting connections",
"workspaces": [