2024-03-12 18:34:05 +00:00
if ( localStorage . getItem ( "DONOTSHARE-secretkey" ) === null ) {
2024-04-28 23:48:03 +01:00
window . location . replace ( "/login" )
2024-03-12 18:34:05 +00:00
document . body . innerHTML = "Redirecting..."
throw new Error ( ) ;
}
if ( localStorage . getItem ( "DONOTSHARE-password" ) === null ) {
2024-04-28 23:48:03 +01:00
window . location . replace ( "/login" )
2024-03-12 18:34:05 +00:00
document . body . innerHTML = "Redirecting..."
throw new Error ( ) ;
}
if ( localStorage . getItem ( "CACHE-username" ) !== null ) {
document . getElementById ( "usernameBox" ) . innerText = localStorage . getItem ( "CACHE-username" )
}
let remote = localStorage . getItem ( "homeserverURL" )
if ( remote == null ) {
localStorage . setItem ( "homeserverURL" , "https://notes.hectabit.org" )
remote = "https://notes.hectabit.org"
}
function formatBytes ( a , b = 2 ) { if ( ! + a ) return "0 Bytes" ; const c = 0 > b ? 0 : b , d = Math . floor ( Math . log ( a ) / Math . log ( 1000 ) ) ; return ` ${ parseFloat ( ( a / Math . pow ( 1000 , d ) ) . toFixed ( c ) ) } ${ [ "Bytes" , "KB" , "MB" , "GB" , "TB" , "PB" , "EB" , "ZB" , "YB" ] [ d ] } ` }
let secretkey = localStorage . getItem ( "DONOTSHARE-secretkey" )
let password = localStorage . getItem ( "DONOTSHARE-password" )
2024-04-24 20:25:23 +01:00
let currentFontSize = 16
2024-04-25 22:34:18 +01:00
let markdowntoggle = false
2024-03-12 18:34:05 +00:00
let usernameBox = document . getElementById ( "usernameBox" )
let optionsCoverDiv = document . getElementById ( "optionsCoverDiv" )
let optionsDiv = document . getElementById ( "optionsDiv" )
let errorDiv = document . getElementById ( "errorDiv" )
let errorMessageThing = document . getElementById ( "errorMessageThing" )
let closeErrorButton = document . getElementById ( "closeErrorButton" )
let cancelErrorButton = document . getElementById ( "cancelErrorButton" )
let errorInput = document . getElementById ( "errorInput" )
let exitThing = document . getElementById ( "exitThing" )
let exitSessionsThing = document . getElementById ( "exitSessionsThing" )
let sessionManagerButton = document . getElementById ( "sessionManagerButton" )
let sessionManagerDiv = document . getElementById ( "sessionManagerDiv" )
let sessionDiv = document . getElementById ( "sessionDiv" )
let deleteMyAccountButton = document . getElementById ( "deleteMyAccountButton" )
let storageThing = document . getElementById ( "storageThing" )
let storageProgressThing = document . getElementById ( "storageProgressThing" )
let usernameThing = document . getElementById ( "usernameThing" )
let logOutButton = document . getElementById ( "logOutButton" )
let notesBar = document . getElementById ( "notesBar" )
let notesDiv = document . getElementById ( "notesDiv" )
let newNote = document . getElementById ( "newNote" )
let noteBox = document . getElementById ( "noteBox" )
let loadingStuff = document . getElementById ( "loadingStuff" )
let exportNotesButton = document . getElementById ( "exportNotesButton" )
2024-04-24 20:25:23 +01:00
let markdown = document . getElementById ( 'markdown' ) ;
2024-04-28 23:48:03 +01:00
let textSizeBox = document . getElementById ( 'textSizeBox' ) ;
let textPlusBox = document . getElementById ( 'textPlusBox' ) ;
let textMinusBox = document . getElementById ( 'textMinusBox' ) ;
let wordCountBox = document . getElementById ( 'wordCountBox' ) ;
let removeBox = document . getElementById ( "removeBox" )
2024-03-12 18:34:05 +00:00
let selectedNote = 0
let timer
let waitTime = 400
if ( /Android|iPhone|iPod/i . test ( navigator . userAgent ) ) {
noteBox . style . width = "10px" ;
notesBar . style . width = "calc(100% - 10px)"
noteBox . readOnly = true
noteBox . style . fontSize = "18px"
noteBox . classList . add ( "hidden" )
2024-04-28 23:48:03 +01:00
let touchstartX , touchstartY , touchendX , touchendY
2024-03-12 18:34:05 +00:00
notesBar . addEventListener ( "touchstart" , function ( event ) {
touchstartX = event . changedTouches [ 0 ] . screenX ;
touchstartY = event . changedTouches [ 0 ] . screenY ;
} , false ) ;
notesBar . addEventListener ( "touchend" , function ( event ) {
touchendX = event . changedTouches [ 0 ] . screenX ;
touchendY = event . changedTouches [ 0 ] . screenY ;
handleGesture ( ) ;
} , false ) ;
noteBox . addEventListener ( "touchstart" , function ( event ) {
touchstartX = event . changedTouches [ 0 ] . screenX ;
touchstartY = event . changedTouches [ 0 ] . screenY ;
} , false ) ;
noteBox . addEventListener ( "touchend" , function ( event ) {
touchendX = event . changedTouches [ 0 ] . screenX ;
touchendY = event . changedTouches [ 0 ] . screenY ;
handleGesture ( ) ;
} , false ) ;
function handleGesture ( ) {
if ( touchendX > touchstartX + 75 ) {
notesBar . style . width = "calc(100% - 10px)" ;
noteBox . style . width = "10px"
2024-04-28 23:48:03 +01:00
if ( selectedNote !== 0 ) {
2024-03-12 18:34:05 +00:00
noteBox . readOnly = true
}
notesDiv . classList . remove ( "hidden" )
noteBox . classList . add ( "hidden" )
newNote . classList . remove ( "hidden" )
}
if ( touchendX < touchstartX - 75 ) {
noteBox . style . width = "calc(100% - 30px)" ;
notesBar . style . width = "10px"
2024-04-28 23:48:03 +01:00
if ( selectedNote !== 0 ) {
2024-03-12 18:34:05 +00:00
noteBox . readOnly = false
}
notesDiv . classList . add ( "hidden" )
noteBox . classList . remove ( "hidden" )
newNote . classList . add ( "hidden" )
}
}
}
noteBox . value = ""
noteBox . readOnly = true
let noteCount = 0
function displayError ( message ) {
errorDiv . classList . remove ( "hidden" )
optionsCoverDiv . classList . remove ( "hidden" )
errorMessageThing . innerHTML = message
}
2024-04-28 23:48:03 +01:00
closeErrorButton . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
errorDiv . classList . add ( "hidden" )
optionsCoverDiv . classList . add ( "hidden" )
} ) ;
2024-04-28 23:48:03 +01:00
closeErrorButton . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
errorDiv . classList . add ( "hidden" )
optionsCoverDiv . classList . add ( "hidden" )
errorInput . classList . add ( "hidden" )
cancelErrorButton . classList . add ( "hidden" )
} ) ;
function updateFont ( ) {
2024-04-24 20:25:23 +01:00
currentFontSize = localStorage . getItem ( "SETTING-fontsize" )
2024-03-12 18:34:05 +00:00
noteBox . style . fontSize = currentFontSize + "px"
textSizeBox . innerText = currentFontSize + "px"
2024-04-26 16:54:57 +01:00
if ( markdowntoggle ) {
2024-04-28 23:48:03 +01:00
markdown . srcdoc = "<!DOCTYPE html><html lang='en'><style>html { height: 100% } body { font-family: 'Inter', sans-serif; height: 100%; color: " + getComputedStyle ( document . documentElement ) . getPropertyValue ( '--text-color' ) + "; font-size: " + currentFontSize + "px; }</style>" + marked . parse ( noteBox . value ) + "</html>" ;
2024-04-25 22:34:18 +01:00
}
2024-03-12 18:34:05 +00:00
}
2024-03-29 20:14:13 +00:00
async function waitforedit ( ) {
2024-03-29 20:05:46 +00:00
while ( true ) {
2024-03-29 20:16:44 +00:00
await fetch ( remote + "/api/waitforedit" , {
2024-03-29 20:05:46 +00:00
method : "POST" ,
body : JSON . stringify ( {
"secretKey" : localStorage . getItem ( "DONOTSHARE-secretkey" )
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
. then ( async ( response ) => {
async function doStuff ( ) {
const data = await response . json ( ) ;
// Access the "note" field from the response
2024-04-28 23:48:03 +01:00
const note = data [ "note" ] ;
if ( note === selectedNote ) {
2024-03-29 20:05:46 +00:00
selectNote ( selectedNote )
}
}
2024-04-28 23:48:03 +01:00
doStuff ( )
} ) ;
2024-03-29 20:05:46 +00:00
}
}
2024-03-12 18:34:05 +00:00
if ( localStorage . getItem ( "SETTING-fontsize" ) === null ) {
localStorage . setItem ( "SETTING-fontsize" , "16" )
updateFont ( )
} else {
updateFont ( )
}
2024-04-28 23:48:03 +01:00
textPlusBox . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
localStorage . setItem ( "SETTING-fontsize" , String ( Number ( localStorage . getItem ( "SETTING-fontsize" ) ) + Number ( 1 ) ) )
updateFont ( )
} ) ;
2024-04-28 23:48:03 +01:00
textMinusBox . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
localStorage . setItem ( "SETTING-fontsize" , String ( Number ( localStorage . getItem ( "SETTING-fontsize" ) ) - Number ( 1 ) ) )
updateFont ( )
} ) ;
function truncateString ( str , num ) {
if ( str . length > num ) {
return str . slice ( 0 , num ) + ".." ;
} else {
return str ;
}
}
function updateUserInfo ( ) {
fetch ( remote + "/api/userinfo" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
2024-04-28 23:48:03 +01:00
. catch ( ( ) => {
2024-03-12 18:34:05 +00:00
noteBox . readOnly = true
noteBox . value = ""
noteBox . placeholder = "Failed to connect to the server.\nPlease check your internet connection."
} )
. then ( ( response ) => {
async function doStuff ( ) {
2024-04-28 23:48:03 +01:00
if ( response . status === 500 ) {
2024-03-12 18:34:05 +00:00
displayError ( "Something went wrong! Signing you out.." )
closeErrorButton . classList . add ( "hidden" )
usernameBox . innerText = ""
setTimeout ( function ( ) {
2024-04-28 23:48:03 +01:00
window . location . replace ( "/logout" )
2024-03-12 18:34:05 +00:00
} , 2500 ) ;
} else {
let responseData = await response . json ( )
usernameBox . innerText = responseData [ "username" ]
usernameThing . innerText = "Username: " + responseData [ "username" ]
storageThing . innerText = "You've used " + formatBytes ( responseData [ "storageused" ] ) + " out of " + formatBytes ( responseData [ "storagemax" ] )
storageProgressThing . value = responseData [ "storageused" ]
storageProgressThing . max = responseData [ "storagemax" ]
noteCount = responseData [ "notecount" ]
localStorage . setItem ( "CACHE-username" , responseData [ "username" ] )
}
}
doStuff ( )
} ) ;
}
2024-04-28 23:48:03 +01:00
usernameBox . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
optionsCoverDiv . classList . remove ( "hidden" )
optionsDiv . classList . remove ( "hidden" )
updateUserInfo ( )
} ) ;
2024-04-28 23:48:03 +01:00
logOutButton . addEventListener ( "click" , ( ) => {
window . location . replace ( "/logout" )
2024-03-12 18:34:05 +00:00
} ) ;
2024-04-28 23:48:03 +01:00
exitThing . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
optionsDiv . classList . add ( "hidden" )
optionsCoverDiv . classList . add ( "hidden" )
} ) ;
2024-04-28 23:48:03 +01:00
deleteMyAccountButton . addEventListener ( "click" , ( ) => {
if ( confirm ( "Are you REALLY sure that you want to delete your account? There's no going back!" ) === true ) {
2024-03-12 18:34:05 +00:00
fetch ( remote + "/api/deleteaccount" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
. then ( ( response ) => {
2024-04-28 23:48:03 +01:00
if ( response . status === 200 ) {
window . location . href = "/logout"
2024-03-12 18:34:05 +00:00
} else {
displayError ( "Failed to delete account (HTTP error code " + response . status + ")" )
}
} )
}
} ) ;
2024-04-28 23:48:03 +01:00
sessionManagerButton . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
optionsDiv . classList . add ( "hidden" )
sessionManagerDiv . classList . remove ( "hidden" )
fetch ( remote + "/api/sessions/list" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
. then ( ( response ) => {
async function doStuff ( ) {
let responseData = await response . json ( )
document . querySelectorAll ( ".burgerSession" ) . forEach ( ( el ) => el . remove ( ) ) ;
2024-04-28 23:48:03 +01:00
let ua ;
2024-03-12 18:34:05 +00:00
for ( let i in responseData ) {
let sessionElement = document . createElement ( "div" )
let sessionText = document . createElement ( "p" )
let sessionImage = document . createElement ( "img" )
let sessionRemoveButton = document . createElement ( "button" )
sessionText . classList . add ( "w300" )
2024-04-28 23:48:03 +01:00
if ( responseData [ i ] [ "thisSession" ] === true ) {
2024-03-12 18:34:05 +00:00
sessionText . innerText = "(current) " + responseData [ i ] [ "device" ]
} else {
sessionText . innerText = responseData [ i ] [ "device" ]
}
sessionText . title = responseData [ i ] [ "device" ]
sessionRemoveButton . innerText = "x"
sessionImage . src = "/static/svg/device_other.svg"
ua = responseData [ i ] [ "device" ]
if ( ua . includes ( "NT" ) || ua . includes ( "Linux" ) ) {
sessionImage . src = "/static/svg/device_computer.svg"
}
2024-04-28 23:48:03 +01:00
if ( ua . includes ( "iPhone" || ua . includes ( "Android" ) || ua . includes ( "iPod" ) ) ) {
2024-03-12 18:34:05 +00:00
sessionImage . src = "/static/svg/device_smartphone.svg"
}
2024-04-28 23:48:03 +01:00
sessionRemoveButton . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
fetch ( remote + "/api/sessions/remove" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey ,
sessionId : responseData [ i ] [ "id" ]
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
2024-04-28 23:48:03 +01:00
. then ( ( ) => {
if ( responseData [ i ] [ "thisSession" ] === true ) {
window . location . replace ( "/logout" )
2024-03-12 18:34:05 +00:00
}
} ) ;
sessionElement . remove ( )
} ) ;
sessionElement . append ( sessionImage )
sessionElement . append ( sessionText )
sessionElement . append ( sessionRemoveButton )
sessionElement . classList . add ( "burgerSession" )
sessionDiv . append ( sessionElement )
}
}
doStuff ( )
} ) ;
} ) ;
2024-04-28 23:48:03 +01:00
exitSessionsThing . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
optionsDiv . classList . remove ( "hidden" )
sessionManagerDiv . classList . add ( "hidden" )
} ) ;
updateUserInfo ( )
function updateWordCount ( ) {
let wordCount = noteBox . value . split ( " " ) . length
2024-04-28 23:48:03 +01:00
if ( wordCount === 1 ) {
2024-03-12 18:34:05 +00:00
wordCount = 0
}
wordCountBox . innerText = wordCount + " words"
}
2024-04-24 20:25:23 +01:00
function renderMarkDown ( ) {
2024-04-26 16:48:32 +01:00
if ( markdowntoggle ) {
2024-04-28 23:48:03 +01:00
markdown . srcdoc = "<!DOCTYPE html><html lang='en'><style>html { height: 100% } body { font-family: 'Inter', sans-serif; height: 100%; color: " + getComputedStyle ( document . documentElement ) . getPropertyValue ( '--text-color' ) + "; font-size: " + currentFontSize + "px; }</style>" + marked . parse ( noteBox . value ) + "</html>"
2024-04-25 22:34:18 +01:00
}
2024-04-24 20:25:23 +01:00
}
2024-03-12 18:34:05 +00:00
function selectNote ( nameithink ) {
document . querySelectorAll ( ".noteButton" ) . forEach ( ( el ) => el . classList . remove ( "selected" ) ) ;
2024-04-28 23:48:03 +01:00
let thingArray = Array . from ( document . querySelectorAll ( ".noteButton" ) ) . find ( el => String ( nameithink ) === String ( el . id ) ) ;
2024-03-12 18:34:05 +00:00
thingArray . classList . add ( "selected" )
fetch ( remote + "/api/readnote" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey ,
noteId : nameithink ,
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
2024-04-28 23:48:03 +01:00
. catch ( ( ) => {
2024-03-12 18:34:05 +00:00
noteBox . readOnly = true
noteBox . value = ""
noteBox . placeholder = ""
displayError ( "Something went wrong... Please try again later!" )
} )
. then ( ( response ) => {
selectedNote = nameithink
noteBox . readOnly = false
noteBox . placeholder = "Type something!"
async function doStuff ( ) {
let responseData = await response . json ( )
let bytes = CryptoJS . AES . decrypt ( responseData [ "content" ] , password ) ;
2024-04-28 23:48:03 +01:00
noteBox . value = bytes . toString ( CryptoJS . enc . Utf8 )
2024-03-12 18:34:05 +00:00
updateWordCount ( )
2024-04-24 20:25:23 +01:00
renderMarkDown ( )
2024-03-12 18:34:05 +00:00
2024-04-28 23:48:03 +01:00
noteBox . addEventListener ( "input" , ( ) => {
2024-03-12 18:34:05 +00:00
updateWordCount ( )
2024-04-24 20:25:23 +01:00
renderMarkDown ( )
2024-03-12 18:34:05 +00:00
clearTimeout ( timer ) ;
timer = setTimeout ( ( ) => {
let encryptedTitle = "New note"
2024-04-28 23:48:03 +01:00
if ( noteBox . value . substring ( 0 , noteBox . value . indexOf ( "\n" ) ) !== "" ) {
2024-03-12 18:34:05 +00:00
let firstTitle = noteBox . value . substring ( 0 , noteBox . value . indexOf ( "\n" ) ) ;
document . getElementById ( nameithink ) . innerText = firstTitle
encryptedTitle = CryptoJS . AES . encrypt ( firstTitle , password ) . toString ( ) ;
}
let encryptedText = CryptoJS . AES . encrypt ( noteBox . value , password ) . toString ( ) ;
2024-04-28 23:48:03 +01:00
if ( selectedNote === nameithink ) {
2024-03-12 18:34:05 +00:00
fetch ( remote + "/api/editnote" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey ,
noteId : nameithink ,
content : encryptedText ,
title : encryptedTitle
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
. then ( ( response ) => {
2024-04-28 23:48:03 +01:00
if ( response . status === 418 ) {
2024-03-12 18:34:05 +00:00
displayError ( "You've ran out of storage... Changes will not be saved until you free up storage!" )
}
} )
2024-04-28 23:48:03 +01:00
. catch ( ( ) => {
2024-03-12 18:34:05 +00:00
displayError ( "Failed to save changes, please try again later..." )
} )
}
} , waitTime ) ;
} ) ;
}
doStuff ( )
} ) ;
}
function updateNotes ( ) {
fetch ( remote + "/api/listnotes" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
. then ( ( response ) => {
async function doStuff ( ) {
document . querySelectorAll ( ".noteButton" ) . forEach ( ( el ) => el . remove ( ) ) ;
noteBox . readOnly = true
selectedNote = 0
noteBox . placeholder = ""
noteBox . value = ""
clearTimeout ( timer )
updateWordCount ( )
2024-04-24 20:25:23 +01:00
renderMarkDown ( )
2024-03-12 18:34:05 +00:00
let responseData = await response . json ( )
for ( let i in responseData ) {
let noteButton = document . createElement ( "button" ) ;
noteButton . classList . add ( "noteButton" )
notesDiv . append ( noteButton )
let bytes = CryptoJS . AES . decrypt ( responseData [ i ] [ "title" ] , password ) ;
let originalTitle = bytes . toString ( CryptoJS . enc . Utf8 ) ;
noteButton . id = responseData [ i ] [ "id" ]
noteButton . innerText = truncateString ( originalTitle , 15 )
noteButton . addEventListener ( "click" , ( event ) => {
if ( event . ctrlKey ) {
fetch ( remote + "/api/removenote" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey ,
noteId : responseData [ i ] [ "id" ]
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
2024-04-28 23:48:03 +01:00
. then ( ( ) => {
2024-03-12 18:34:05 +00:00
updateNotes ( )
} )
2024-04-28 23:48:03 +01:00
. catch ( ( ) => {
2024-03-12 18:34:05 +00:00
displayError ( "Something went wrong! Please try again later..." )
} )
} else {
selectNote ( responseData [ i ] [ "id" ] )
}
} ) ;
}
document . querySelectorAll ( ".loadingStuff" ) . forEach ( ( el ) => el . remove ( ) ) ;
}
doStuff ( )
} ) ;
}
updateNotes ( )
2024-04-28 23:48:03 +01:00
newNote . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
let noteName = "New note"
2024-04-28 23:48:03 +01:00
let encryptedName = CryptoJS . AES . encrypt ( noteName , password ) . toString ( CryptoJS . enc . Utf8 ) ;
2024-03-12 18:34:05 +00:00
fetch ( remote + "/api/newnote" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey ,
noteName : encryptedName ,
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
2024-04-28 23:48:03 +01:00
. catch ( ( ) => {
2024-03-12 18:34:05 +00:00
displayError ( "Failed to create new note, please try again later..." )
} )
. then ( ( response ) => {
if ( response . status !== 200 ) {
updateNotes ( )
displayError ( "Failed to create new note (HTTP error code " + response . status + ")" )
} else {
updateNotes ( )
}
} ) ;
} ) ;
function downloadObjectAsJson ( exportObj , exportName ) {
2024-04-28 23:48:03 +01:00
let dataStr = "data:text/json;charset=utf-8," + encodeURIComponent ( JSON . stringify ( exportObj ) ) ;
let downloadAnchorNode = document . createElement ( "a" ) ;
2024-03-12 18:34:05 +00:00
downloadAnchorNode . setAttribute ( "href" , dataStr ) ;
downloadAnchorNode . setAttribute ( "download" , exportName + ".json" ) ;
document . body . appendChild ( downloadAnchorNode ) ;
downloadAnchorNode . click ( ) ;
downloadAnchorNode . remove ( ) ;
}
function exportNotes ( ) {
fetch ( remote + "/api/exportnotes" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
. then ( ( response ) => {
async function doStuff ( ) {
let responseData = await response . json ( )
for ( let i in responseData ) {
exportNotes . innerText = "Decrypting " + i + "/" + noteCount
let bytes = CryptoJS . AES . decrypt ( responseData [ i ] [ "title" ] , password ) ;
2024-04-28 23:48:03 +01:00
responseData [ i ] [ "title" ] = bytes . toString ( CryptoJS . enc . Utf8 )
2024-03-12 18:34:05 +00:00
let bytesd = CryptoJS . AES . decrypt ( responseData [ i ] [ "content" ] , password ) ;
2024-04-28 23:48:03 +01:00
responseData [ i ] [ "content" ] = bytesd . toString ( CryptoJS . enc . Utf8 )
2024-03-12 18:34:05 +00:00
}
let jsonString = JSON . parse ( JSON . stringify ( responseData ) )
exportNotesButton . innerText = "Export notes"
downloadObjectAsJson ( jsonString , "data" )
optionsDiv . classList . add ( "hidden" )
displayError ( "Exported notes!" )
}
doStuff ( )
} )
}
function isFirstTimeVisitor ( ) {
2024-04-24 17:08:32 +01:00
if ( localStorage . getItem ( "FIRSTVISIT" ) === null ) {
localStorage . setItem ( "FIRSTVISIT" , "1" )
2024-03-12 18:34:05 +00:00
return true ;
2024-04-24 17:08:32 +01:00
} else {
return false ;
2024-03-12 18:34:05 +00:00
}
}
function firstNewVersion ( ) {
2024-04-28 23:48:03 +01:00
if ( localStorage . getItem ( "NEWVERSION" ) === "1.2" ) {
2024-03-12 18:34:05 +00:00
return false ;
} else {
2024-04-24 17:08:32 +01:00
localStorage . setItem ( "NEWVERSION" , "1.2" )
2024-03-12 18:34:05 +00:00
return true ;
}
}
2024-04-24 20:25:23 +01:00
function toggleMarkdown ( ) {
if ( markdown . style . display === 'none' ) {
markdown . style . display = 'inherit' ;
2024-04-25 22:34:18 +01:00
markdowntoggle = true
2024-04-28 23:48:03 +01:00
renderMarkDown ( )
2024-04-24 20:25:23 +01:00
} else {
markdown . style . display = 'none' ;
2024-04-25 22:34:18 +01:00
markdowntoggle = false
2024-04-28 23:48:03 +01:00
markdown . srcdoc = ""
2024-04-24 20:25:23 +01:00
}
}
2024-04-28 23:48:03 +01:00
exportNotesButton . addEventListener ( "click" , ( ) => {
2024-03-12 18:34:05 +00:00
exportNotesButton . innerText = "Downloading..."
exportNotes ( )
} ) ;
2024-04-28 23:48:03 +01:00
removeBox . addEventListener ( "click" , ( ) => {
if ( selectedNote === 0 ) {
2024-03-12 18:34:05 +00:00
displayError ( "You need to select a note first!" )
} else {
fetch ( remote + "/api/removenote" , {
method : "POST" ,
body : JSON . stringify ( {
secretKey : secretkey ,
noteId : selectedNote
} ) ,
headers : {
"Content-Type" : "application/json; charset=UTF-8"
}
} )
2024-04-28 23:48:03 +01:00
. then ( ( ) => {
2024-03-12 18:34:05 +00:00
updateNotes ( )
} )
2024-04-28 23:48:03 +01:00
. catch ( ( ) => {
2024-03-12 18:34:05 +00:00
displayError ( "Something went wrong! Please try again later..." )
} )
}
} ) ;
2024-04-24 20:25:23 +01:00
document . addEventListener ( "DOMContentLoaded" , function ( ) {
2024-04-28 23:48:03 +01:00
markdown . srcdoc = "<!DOCTYPE html><html lang='en'><style>html { height: 100% } body { font-family: 'Inter', sans-serif; height: 100%; color: " + getComputedStyle ( document . documentElement ) . getPropertyValue ( '--text-color' ) + "; font-size: " + currentFontSize + "px; }</style>" + marked . parse ( noteBox . value ) + "</html>"
2024-04-24 20:25:23 +01:00
} ) ;
2024-03-12 18:34:05 +00:00
if ( isFirstTimeVisitor ( ) && /Android|iPhone|iPod/i . test ( navigator . userAgent ) ) {
displayError ( "To use Burgernotes:\n Swipe Right on a note to open it\n Swipe left in the text boxes to return to notes\n Click on a note to highlight it" )
}
if ( firstNewVersion ( ) ) {
2024-04-16 13:07:57 +01:00
displayError ( "What's new in Burgernotes 1.2-1?\nNotes now support live editing\nFixed various bugs and issues in the client" )
2024-03-12 18:34:05 +00:00
}
2024-03-29 20:05:46 +00:00
2024-04-29 00:19:25 +01:00
waitforedit ( )