Files
ERitors-Scribe-Desktop/lib/models/QuillSense.ts
natreex 060693f152 Add OAuth login support and streamline authentication flows
- Introduced `oauthLogin` method in `electron/preload.ts` and backend IPC handlers for OAuth via `BrowserWindow`.
- Replaced web-based OAuth redirection with Electron-specific implementation for Google, Facebook, and Apple.
- Refactored `SocialForm.tsx` to handle OAuth login success and token management via Electron.
- Updated `User`, `QuillSense`, and context methods to include `quill-trial` subscriptions and extended login logic.
- Cleaned up code, removed unused imports, and improved error handling for authentication scenarios.
2026-01-08 11:03:19 -05:00

135 lines
3.4 KiB
TypeScript

import User, {Subscription} from "@/lib/models/User";
import {SessionProps} from "@/lib/models/Session";
export type MessageType = "user" | "model";
export type QSView = 'list' | 'chat' | 'ghostwritter' | 'dictionary' | 'synonyms' | 'conjugator' | 'inspiration'
export type ConversationType = 'dictionary' | 'synonyms' | 'conjugator' | 'chatbot' | 'inspire';
export interface Message {
id: number;
type: MessageType;
message: string;
date: string;
}
export interface Conversation {
id: string;
title?: string;
date?: string;
type?: ConversationType;
messages: Message[];
status: number;
totalPrice?: number
useYourKey?: boolean;
}
export interface AIGeneratedText {
totalTokens: number;
totalPrice: number;
response: string;
}
export interface AIResponseWithCredits<T> {
useYourKey: boolean;
totalPrice: number;
data: T;
}
export interface AIDictionary extends AIResponseWithCredits<DictionaryAIResponse> {
}
export interface AIGeneratedTextData {
totalCost: number;
response: string;
}
export interface AIGeneratedText extends AIResponseWithCredits<AIGeneratedTextData> {
}
export interface AIInspire extends AIResponseWithCredits<InspireAIResponse> {
}
export interface AISynonyms extends AIResponseWithCredits<SynonymsAIResponse> {
}
export interface AIVerbConjugation extends AIResponseWithCredits<unknown> {
}
interface InspireAIResponse {
ideas: {
idea: string,
reason: string;
relatedTo: string;
}[]
}
export interface DictionaryAIResponse {
word: string;
definition: string;
example: string;
literaryUsage: string
}
export interface SynonymAI {
word: string;
context: string;
}
export interface SynonymsAIResponse {
words: SynonymAI[];
}
export interface InspirationAIIdea {
idea: string;
reason: string;
relatedTo: string;
}
export interface ConversationProps {
id: string;
mode: string;
title: string;
startDate: string;
status: number;
}
export default class QuillSense {
static getSubLevel(session: SessionProps): number {
let currentSub: Subscription | null = User.getCurrentSubscription(session?.user, 'quill-sense');
if (!currentSub) {
currentSub = User.getCurrentSubscription(session?.user, 'quill-trial');
if (!currentSub) {
return 0;
}
}
switch (currentSub?.subTier) {
case 1:
return 1;
case 2:
return 2;
case 3:
return 3;
default:
return 0;
}
};
static isBringYourKeys(session: SessionProps): boolean {
if (!session?.user) return false;
const currentSub: Subscription | null = User.getCurrentSubscription(session?.user, 'use-your-keys');
return currentSub?.status || session.user.groupId <= 4;
}
static isGeminiEnabled(session: SessionProps): boolean {
return session.user?.apiKeys.gemini || false;
}
static isAnthropicEnabled(session: SessionProps): boolean {
return session.user?.apiKeys.anthropic || false;
}
static isOpenAIEnabled(session: SessionProps): boolean {
return session.user?.apiKeys.openai || false;
}
}