From 636b0323075225c584b62719ed51e75521bb7ffb Mon Sep 17 00:00:00 2001 From: aura Date: Tue, 17 Feb 2026 22:39:42 +0100 Subject: push source --- moneyjsx/src/settings.tsx | 402 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 402 insertions(+) create mode 100644 moneyjsx/src/settings.tsx (limited to 'moneyjsx/src/settings.tsx') diff --git a/moneyjsx/src/settings.tsx b/moneyjsx/src/settings.tsx new file mode 100644 index 0000000..ba39126 --- /dev/null +++ b/moneyjsx/src/settings.tsx @@ -0,0 +1,402 @@ +import $ from "jquery"; +import * as JSX from "./jsx"; +import * as api from "./api"; +import * as util from "./util"; +import * as user from "./user"; +import * as terminal from "./terminal"; +import { + addPopup, onPopupClosed, closePopup, + Dropdown, DropdownItem, + Spinner, + OkPopup, OkCancelPopup +} from "./components"; + +let old_font = ''; +const fonts = [ + 'Terminal', + 'Arial', + 'Monospace', + 'Sans-serif', + 'Serif', + 'Times' +]; + +function showDeleteTokenPopup( id: number ) { + const deleteToken = async() => { + try { + await user.deleteToken( id ); + $( `#token-${ id }` ).remove(); + } catch( e: any ) { + addPopup( $( + Error deleting token: { e.message } + ) ); + } + } + + addPopup( $( + + Are you sure you want to erase this API token? + + ) ); +} + +function showDeleteAllTokensPopup() { + const deleteTokens = async() => { + try { + await user.deleteAllTokens(); + closePopup(); + } catch( e: any ) { + addPopup( $( + Error deleting all tokens: { e.message } + ) ); + } + } + + addPopup( $( + + Are you sure you want to erase all API tokens? + + ) ); +} + +function TokenEntry( props: any ) { + const token = props.token; + + return
+ { token.value } + +
+} + +async function createNewToken( e: Event ) { + const btn = $( e.target ); + + e.preventDefault(); + e.stopPropagation(); + + const spinner = $( ); + btn.append( spinner ); + + try { + const token = await user.createToken(); + const tokens = await user.getTokens(); + // re-draw token popup + closePopup(); + addPopup( $( ) ); + + const copyTokenToClipboard = () => { navigator.clipboard.writeText( token ); } + addPopup( $( + + Your api token has been created.
+ Make sure to save it as it will not be shown to you again.
+
+ { token } +
+ + Press OK to copy the token to clipboard. +
+ ) ); + } catch( e: any ) { + addPopup( $( + + Error creating token: { e.message } + + ) ); + } + + spinner.remove(); +} + +function TokensPopup( props: any ) { + return
+ { props.tokens.length > 0 && +
+ { props.tokens.map( ( tok: any ) => { + return + } ) } +
+ } + { + props.tokens.length == 0 &&
+ No api tokens have been created. +
+ } +
+ + +
+
+} + +async function openTokensPopup() { + let spinner = $( ); + $( "#tokens-btn" ).append( spinner ); + try { + const tokens = await user.getTokens(); + spinner.remove(); + + return addPopup( $( ) ); + } catch( e: any ) { + spinner.remove(); + return addPopup( $( { e.message } ) ); + } +} + + +function showDeleteNotePopup( note_id: string ) { + const deleteNote = async() => { + try { + await user.deleteNote( note_id ); + $( `#note-${ note_id }` ).remove(); + } catch( e: any ) { + addPopup( $( + + Error deleting note
{ e.message } +
+ ) ); + } + } + + addPopup( $( + + Are you sure you want to delete this note? + + ) ); +} + +function showDeleteAllNotesPopup() { + addPopup( $( + { await user.deleteAllNotes(); closePopup(); } }> + Are you sure you want to delete all notes? + + ) ); +} + +function NotesPopup( props: any ) { + return
+
+ { props.notes.map( ( n: any ) => { + return
+ { n.content.split(' : ')[1] } + +
+ } ) } +
+
+ +
+
+} + +async function openNotesPopup() { + let spinner = $( ); + $( "#notes-btn" ).append( spinner ); + try { + const notes = await user.getNotes(); + spinner.remove(); + if( notes.length == 0 ) + return addPopup( $( No notes found ) ); + + return addPopup( $( ) ); + } catch( e: any ) { + spinner.remove(); + return addPopup( $( { e.message } ) ); + } +} + +function onSettingsClosed() { + if( old_font.length > 0 ) { + const style = document.documentElement.style; + style.setProperty( "--site-font", old_font ); + } +} + +function onFontChanged( e: Event ) { + const el = $( e.target ); + const font = el.text(); + if( !old_font.length ) + old_font = user.settings.site_prefs.font; + + user.settings.site_prefs.font = font; + const style = document.documentElement.style; + style.setProperty( "--site-font", font ); + + $( "#settings-font" ).text( font ); + closePopup(); +} + +function onModelChanged( e: Event ) { + const el = $( e.target ); + const model = el.text(); + + if( user.settings.plan.plan == 'free' ) { + for( let m of api.models ) { + if( m.name == model && !m.free ) { + const popup = $( JSX.navigateParams( "/upgrade", {} ) }> + This model is only available for paid users. + Please upgrade your plan to use it. + ); + + return addPopup( popup ); + } + } + } + + user.settings.site_prefs.model = model; + + $( "#settings-model" ).text( model ); + closePopup(); +} + +async function save() { + const newprefs = { + site_prefs: user.settings.site_prefs, + prompt_data: user.settings.prompt_data, + nickname: user.settings.nickname + }; + + const newprompt = $( "#system-prompt" ).val(); + newprefs.prompt_data.system = newprompt as string; + + const newname = $( "#uname-setting" ).val() as string; + if( newname.length > 1 ) + newprefs.nickname = newname; + + $( "#settings-spinner-wrapper" ).append( ); + try { + await user.savePrefs( newprefs ); + } catch( e: any ) { + $( "#settings-spinner-wrapper" ).empty(); + $( "#settings-spinner-wrapper" ).append(
{ e.message }
); + return; + } + + old_font = ''; + $( "#settings-spinner-wrapper" ).empty(); + $( "#username" ).text( user.settings.nickname ); + $( "#uname-setting" ).attr( "placeholder", user.settings.nickname ); + terminal.updateCapabilitiesDisplay(); +} + +function PlanDisplay() { + const el = $(
); + if( user.settings.plan.plan == 'free' ) { + el.append( + + Plan: free  + JSX.navigate( "/upgrade" ) }>[ upgrade ] + + ); + } else { + el.append( + + Plan: { user.settings.plan.plan } + + ); + + let days_left = ''; + if( user.settings.plan.endTime == -1 ) + days_left = 'inf'; + else + days_left = Math.floor( ( user.settings.plan.endTime - Date.now() ) / 60000 / 60 / 24 ).toString(); + el.append( + + Time left: { days_left.toString() } days + + ); + } + + return el[0]; +} + +async function downloadAllData() { + const spinner = $( ); + $( "#settings-spinner-wrapper" ).append( spinner ); + + try { + await user.downloadAllData(); + } catch( e: any ) { + addPopup( $( + + Error processing request: { e.message } + + ) ); + } + + spinner.remove(); +} + +async function invalidateAllSessions() { + const spinner = $( ); + $( "#settings-spinner-wrapper" ).append( spinner ); + + try { + await user.invalidateAllSessions(); + } catch( e: any ) { + addPopup( $( + + Error invalidating sessions: { e.message } + + ) ); + } + + spinner.remove(); +} + +function SettingsPopup() { + return
+
+
+
+ +
+
+
+ + +
+
+ + + { fonts.map( ( f ) => { f } ) } + +
+
+ + + { api.models.map( ( m ) => { + if( m.free || user.settings.plan.plan == 'paid' ) + return { m.name }; + return { m.name }; + } ) } + +
+
+ + +
+ +
+
+ +
+ + + +
+
+
; +} + +export function openPopup() { + if( !user.is_loggedin ) + return; + const el = $( ); + addPopup( el ); + onPopupClosed( onSettingsClosed ); +} -- cgit v1.2.3