Files
overleaf-cep/services/web/frontend/js/shared/context/user-features-context.tsx
Jimmy Domagala-Tang f96d37b7e3 Revert "Revert "[Web] Enable Quota System for AI Features"" (#31771)
* Revert "Revert "[Web] Enable Quota System for AI Features (#31544)" (#31767)"

This reverts commit f6589bdbf0ac7e71313739e3e3f4fb5bedd48c22.

* Update writefull entitlement syncing for commons (#31774)

* feat: update wf entitlement syncing logic

* feat: remove unused env variable, and parse quota tier as string for analytics

GitOrigin-RevId: 37ae7522a249501719a64327e2b6aaff01a3cc0b
2026-03-06 09:07:15 +00:00

78 lines
2.1 KiB
TypeScript

import {
createContext,
FC,
useCallback,
useContext,
useEffect,
useState,
} from 'react'
import { User } from '../../../../types/user'
import { useUserContext } from './user-context'
import { useReceiveUser } from '../hooks/user-channel/use-receive-user'
import { getJSON } from '@/infrastructure/fetch-json'
import { useEditorContext } from './editor-context'
import getMeta from '@/utils/meta'
export const UserFeaturesContext = createContext<User['features']>(undefined)
const onAiFreeTrial = getMeta('ol-onAiFreeTrial')
export const UserFeaturesProvider: FC<React.PropsWithChildren> = ({
children,
}) => {
const user = useUserContext()
const { writefullInstance } = useEditorContext()
const [features, setFeatures] = useState(user.features || {})
useReceiveUser(
useCallback(data => {
if (data?.features) {
setFeatures(data.features)
}
}, [])
)
useEffect(() => {
const listener = async ({ isPremium }: { isPremium: boolean }) => {
// todo: quota clean-up: remove once we are transitioned off aiErrorAssistant naming
const hasPremiumQuota = !onAiFreeTrial
const alreadyPremium =
features?.aiErrorAssistant === isPremium ||
hasPremiumQuota === isPremium
if (alreadyPremium) {
// the user is premium on writefull and has the AI assist, no need to refresh the features
return
}
const newFeatures = await getJSON('/user/features')
setFeatures(newFeatures)
}
writefullInstance?.addEventListener('writefull-login-complete', listener)
return () => {
writefullInstance?.removeEventListener(
'writefull-login-complete',
listener
)
}
}, [features?.aiErrorAssistant, writefullInstance])
return (
<UserFeaturesContext.Provider value={features}>
{children}
</UserFeaturesContext.Provider>
)
}
export function useUserFeaturesContext() {
const context = useContext(UserFeaturesContext)
if (!context) {
throw new Error(
'useUserFeaturesContext is only available inside UserFeaturesContext'
)
}
return context
}