summaryrefslogtreecommitdiff
path: root/moneyjsx/src/user.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'moneyjsx/src/user.tsx')
-rw-r--r--moneyjsx/src/user.tsx261
1 files changed, 261 insertions, 0 deletions
diff --git a/moneyjsx/src/user.tsx b/moneyjsx/src/user.tsx
new file mode 100644
index 0000000..7755670
--- /dev/null
+++ b/moneyjsx/src/user.tsx
@@ -0,0 +1,261 @@
+import $ from 'jquery';
+
+import * as JSX from './jsx';
+import * as api from './api';
+
+export interface ChatFile {
+ id: string,
+ name: string
+}
+
+export interface UserSettings {
+ uuid: string,
+ nickname: string,
+ site_prefs: {
+ font: string,
+ model?: string
+ },
+ prompt_data: {
+ system?: string
+ },
+ chat_files?: {
+ files?: ChatFile[]
+ },
+ plan: {
+ endTime: number,
+ plan: string
+ }
+};
+
+export let is_loggedin = false;
+export let settings: UserSettings = null;
+
+let on_prefs_updated: Function = () => {};
+
+export async function onPrefsUpdated( fn: Function ) {
+ on_prefs_updated = fn;
+}
+
+/**
+ * polls settings from the server
+**/
+export async function updatePrefs() {
+ if( !is_loggedin ) {
+ return;
+ }
+
+ let res = null;
+ try {
+ res = await fetch( `${api.url}/settings`, {
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify( {
+ token: localStorage.getItem( 'session' ),
+ } )
+ } );
+
+ if( !res.ok ) {
+ try {
+ const json = await res.json();
+ if( json.status == 'nodata' ) {
+ localStorage.setItem( 'needs-setup', 'true' );
+ if( window.location.pathname != '/first-landing' )
+ return JSX.navigate( '/first-landing' );
+ else {
+ settings = null;
+ localStorage.setItem( 'settings', '{}' );
+ }
+ } else if( json.status != 'ok' ) {
+ is_loggedin = false;
+ localStorage.clear();
+ }
+
+ throw new Error( json.msg );
+ } catch( e: any ) {
+ throw new Error( "error contacting server" );
+ }
+ }
+
+ res = await res.json();
+ } catch( e: any ) {
+ throw new Error( e.message );
+ }
+
+ settings = res.userprefs;
+ localStorage.setItem( 'settings', JSON.stringify( settings ) );
+ on_prefs_updated();
+}
+
+/**
+ * saves prefs on the server
+**/
+export async function savePrefs( prefs: any ) {
+ const res = await api.post( `update-settings`, { token: localStorage.getItem( 'session' ), prefs } );
+ settings = res.userprefs;
+ localStorage.setItem( 'settings', JSON.stringify( settings ) );
+}
+
+export async function getNotes() {
+ const res = await api.post( `get-notes`, { token: localStorage.getItem( 'session' ) } );
+ return res.notes;
+}
+
+export async function deleteNote( note_id: string ) {
+ await api.post( `delete-note`, { token: localStorage.getItem( 'session' ), noteId: note_id } );
+}
+
+export async function deleteAllNotes() {
+ await api.post( `delete-notes`, { token: localStorage.getItem( 'session' ) } );
+}
+
+export async function getTokens() {
+ const res = await api.post( `get-tokens`, { token: localStorage.getItem( 'session' ) } );
+ return res.tokens;
+}
+
+export async function createToken() {
+ const res = await api.post( `create-token`, { token: localStorage.getItem( 'session' ) } );
+ return res.token;
+}
+
+export async function deleteToken( token_id: number ) {
+ await api.post( `delete-token`, { id: token_id, token: localStorage.getItem( 'session' ) } );
+}
+
+export async function deleteAllTokens() {
+ await api.post( `delete-tokens`, { token: localStorage.getItem( 'session' ) } );
+}
+
+export async function createChat() {
+ const res = await api.post( `create-chat`, { token: localStorage.getItem( 'session' ) } );
+ return res;
+}
+
+export async function deleteChat( chatId: string ) {
+ await api.post( `delete-chat`, { chatId, token: localStorage.getItem( 'session' ) } );
+}
+
+export async function downloadAllData() {
+ let res = await fetch( `${api.url}/getalldata`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify( { token: localStorage.getItem( 'session' ) } )
+ } );
+
+ let contentType = res.headers.get( 'content-type' );
+ if( contentType && contentType.includes( 'application/zip' ) ) {
+ let blob = await res.blob();
+ let url = window.URL.createObjectURL( blob );
+ const a = <a style="display:none" href={url} download="userdata.zip"/>;
+ $( 'body' ).append( a );
+ a.onclick = ( e: Event ) => { e.stopPropagation(); };
+ a.click();
+ window.URL.revokeObjectURL( url );
+ }
+ else {
+ let json = null;
+ try {
+ json = await res.json();
+ } catch( e: any ) {
+ throw new Error( "Error contacting server" );
+ }
+
+ if( json.status != 'ok' )
+ throw new Error( json.msg );
+ }
+}
+
+export async function invalidateAllSessions() {
+ const res = await api.post( `invalidate-all-sessions`, { token: localStorage.getItem( 'session' ) } );
+ localStorage.setItem( 'session', res.session );
+}
+
+function updateFont() {
+ const style = document.documentElement.style;
+ if( settings.site_prefs && settings.site_prefs.font != null )
+ style.setProperty( "--site-font", settings.site_prefs.font );
+}
+
+async function onNavigateAsync() {
+ try {
+ if( is_loggedin ) {
+ if( localStorage.getItem( 'needs-setup' ) && window.location.pathname !== "/first-landing" )
+ setTimeout( () => JSX.navigate( "/first-landing" ) );
+ else
+ await updatePrefs();
+ // update it again in case it changed in prefs
+ updateFont();
+ }
+
+ await api.updateModels();
+ } catch( e: any ) {
+ // todo: display message box w error
+ console.log( e );
+ }
+}
+
+export function onNavigate() {
+ settings = JSON.parse( localStorage.getItem( 'settings' ) || '{}' ) as UserSettings;
+ api.parseModels();
+ if( localStorage.getItem( 'session' ) )
+ is_loggedin = true;
+
+ if( is_loggedin )
+ updateFont();
+
+ onNavigateAsync();
+}
+
+/**
+ * returns true on success, error message on failure
+**/
+export async function sendLoginLink( email: string ) {
+ let res = null;
+ try {
+ res = await api.post( `send-login-link`, { email } );
+ } catch( e: any ) {
+ return e.message;
+ }
+
+ return true;
+}
+
+export async function onLogin( code: string ) {
+ let json = null;
+ try {
+ const res = await fetch( `${api.url}/login?token=${code}` );
+ json = await res.json();
+ } catch( e: any ) {
+ throw new Error( "error contacting server" );
+ }
+
+ if( json.status != 'ok' )
+ throw new Error( json.msg );
+
+ localStorage.setItem( 'session', json.session );
+ is_loggedin = true;
+
+ try {
+ await updatePrefs();
+ } catch( e: any ) {
+ throw new Error( e.msg );
+ }
+}
+
+export async function logout() {
+ if( !is_loggedin )
+ return;
+
+ try {
+ await api.post( 'invalidate-session', { token: localStorage.getItem( 'session' ) } );
+ } catch( e: any ) {}
+
+ localStorage.clear();
+ is_loggedin = false;
+ JSX.navigate( '/' );
+ window.location.reload();
+}