Merge pull request #36181 from overleaf/mj-offline-mode-feature

[web] Add offline mode to feature set

GitOrigin-RevId: 93d2ed373af5b46f5ead924c14605775826c46e3
This commit is contained in:
Mathias Jakobsen
2026-09-17 11:50:44 +00:00
committed by Copybot
parent 42feabe643
commit f7de42f1d3
9 changed files with 20 additions and 4 deletions
+5
View File
@@ -154,6 +154,10 @@ export const UserSchema = new Schema(
default: Settings.defaultFeatures.symbolPalette,
},
aiUsageQuota: { type: String, default: 'basic' },
offlineMode: {
type: Boolean,
default: Settings.defaultFeatures.offlineMode,
},
},
featuresOverrides: [
{
@@ -181,6 +185,7 @@ export const UserSchema = new Schema(
zotero: { type: Boolean },
referencesSearch: { type: Boolean },
symbolPalette: { type: Boolean },
offlineMode: { type: Boolean },
},
},
],
+1
View File
@@ -435,6 +435,7 @@ module.exports = {
compileGroup: 'standard',
references: true,
trackChanges: true,
offlineMode: false,
}),
// featuresEpoch: 'YYYY-MM-DD',
@@ -34,7 +34,7 @@ export const UnsavedDocsProvider: FC<React.PropsWithChildren> = ({
const { permissionsLevel, setPermissionsLevel } = useIdeReactContext()
const [isLocked, setIsLocked] = useState(false)
const [unsavedDocs, setUnsavedDocs] = useState(new Map<string, number>())
const isPremiumUser = Boolean(getMeta('ol-user')?.features?.versioning)
const isPremiumUser = Boolean(getMeta('ol-user')?.features?.offlineMode)
const intermittentConnectionImprovementsEnabled = useFeatureFlag(
'intermittent-connection-improvements'
)
@@ -116,6 +116,7 @@ module.exports = {
trackChanges: false,
symbolPalette: false,
aiUsageQuota: 'basic',
offlineMode: false,
},
personal: {
collaborators: 1,
@@ -133,6 +134,7 @@ module.exports = {
trackChanges: false,
symbolPalette: false,
aiUsageQuota: 'basic',
offlineMode: false,
},
collaborator: {
collaborators: 10,
@@ -150,6 +152,7 @@ module.exports = {
trackChanges: true,
symbolPalette: true,
aiUsageQuota: 'basic',
offlineMode: true,
},
professional: {
collaborators: -1,
@@ -167,6 +170,7 @@ module.exports = {
trackChanges: true,
symbolPalette: true,
aiUsageQuota: 'basic',
offlineMode: true,
},
}),
@@ -44,10 +44,9 @@ function mount(
intermittentConnectionImprovementsEnabled?: boolean
} = {}
) {
// the provider reads getMeta('ol-user') to decide the lock threshold; the
// `versioning` feature marks a premium user
// the provider reads getMeta('ol-user') to decide the lock threshold
window.metaAttributesCache.set('ol-user', {
features: isPremiumUser ? { versioning: true } : {},
features: isPremiumUser ? { offlineMode: true } : {},
})
// the provider reads the split test variant via useFeatureFlag
window.metaAttributesCache.set('ol-splitTestVariants', {
@@ -18,6 +18,7 @@ const features = {
compileGroup: 'priority',
trackChanges: true,
symbolPalette: true,
offlineMode: true,
},
personal: {
aiUsageQuota: 'basic',
@@ -35,6 +36,7 @@ const features = {
compileGroup: 'priority',
trackChanges: false,
symbolPalette: true,
offlineMode: true,
},
collaborator: {
aiUsageQuota: 'standard',
@@ -52,6 +54,7 @@ const features = {
compileGroup: 'priority',
trackChanges: true,
symbolPalette: true,
offlineMode: true,
},
professional: {
aiUsageQuota: 'unlimited',
@@ -69,6 +72,7 @@ const features = {
compileGroup: 'priority',
trackChanges: true,
symbolPalette: true,
offlineMode: true,
},
} satisfies Record<string, Features>
@@ -20,6 +20,7 @@ describe('UserFeaturesUpdater', function () {
zotero: true,
mendeley: true,
symbolPalette: true,
offlineMode: true,
}
ctx.User = {
findByIdAndUpdate: sinon.stub().returns({
+1
View File
@@ -9,6 +9,7 @@ export type Features = {
gitBridge: boolean
github: boolean
mendeley: boolean
offlineMode: boolean
references: boolean
referencesSearch: boolean
symbolPalette: boolean
+1
View File
@@ -18,6 +18,7 @@ export type Features = {
gitBridge?: boolean
github?: boolean
mendeley?: boolean
offlineMode?: boolean
papers?: boolean
references?: boolean
referencesSearch?: boolean