From a63488d62afa594c8e370a043f7fb26dd4e99bc5 Mon Sep 17 00:00:00 2001 From: marlon-erler Date: Thu, 24 Sep 2026 22:07:36 +0200 Subject: [PATCH] implement update prompt, clean service worker handling --- 1.vim | 913 +++++++------------------- dist/index.html | 1 - dist/index.js | 61 +- dist/support.js | 35 - dist/sw.js | 49 +- dist/version.txt | 1 + src/View/Modals/settingsModal.tsx | 2 +- src/View/homePage.tsx | 345 +++++----- src/View/translations.ts | 6 + src/ViewModel/Global/coreViewModel.ts | 142 ++-- 10 files changed, 625 insertions(+), 930 deletions(-) delete mode 100644 dist/support.js create mode 100644 dist/version.txt diff --git a/1.vim b/1.vim index e7845fe4..7a124db8 100644 --- a/1.vim +++ b/1.vim @@ -136,7 +136,7 @@ set ruler set runtimepath=~/.vim,~/.vim/pack/airblade/start/vim-gitgutter,~/.vim/plugged/coc.nvim,~/.vim/plugged/emmet-vim,~/.vim/plugged/nerdtree,~/.vim/plugged/typescript-vim,~/.vim/plugged/vim-jsx-typescript,~/.vim/plugged/vim-table-mode,~/.vim/plugged/ctrlp.vim,/var/lib/vim/addons,/etc/vim,/usr/share/vim/vimfiles,/usr/share/vim/vim90,/usr/share/vim/vimfiles/after,/etc/vim/after,/var/lib/vim/addons/after,~/.vim/plugged/vim-jsx-typescript/after,~/.vim/after set shiftwidth=4 set smarttab -set suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc +set suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc,.snap set updatetime=500 let s:so_save = &g:so | let s:siso_save = &g:siso | setg so=0 siso=0 | setl so=-1 siso=-1 let v:this_session=expand(":p") @@ -151,24 +151,26 @@ if &shortmess =~ 'A' else set shortmess=aoO endif -badd +129 src/ViewModel/Chat/chatViewModel.ts -badd +157 src/ViewModel/Pages/messagePageViewModel.ts -badd +465 src/Model/Chat/chatModel.ts -badd +113 src/ViewModel/Chat/chatMessageViewModel.ts -badd +13 src/ViewModel/Global/coreViewModel.ts -badd +7 src/View/ChatPages/messagePage.css -badd +79 src/View/ChatPages/messagePage.tsx -badd +75 src/View/Components/chatMessage.tsx -badd +77 src/View/Modals/chatMessageInfoModal.tsx -badd +0 src/View/Components/replyViewHeader.tsx -badd +0 src/View/translations.ts +badd +118 build/styles.css +badd +27 src/base.css +badd +16 package.json +badd +1 build/version.txt +badd +95 src/ViewModel/Global/coreViewModel.ts +badd +194 src/View/Modals/settingsModal.tsx +badd +8 dist/sw.js +badd +10 build/sw.js +badd +80 src/index.tsx +badd +25 src/react.ts +badd +19 src/Model/Utility/utility.ts +badd +0 build/support.js +badd +724 src/View/translations.ts +badd +8 src/View/homePage.tsx argglobal %argdel set stal=2 tabnew +setlocal\ bufhidden=wipe -tabnew +setlocal\ bufhidden=wipe tabrewind -edit src/View/ChatPages/messagePage.tsx +edit build/sw.js let s:save_splitbelow = &splitbelow let s:save_splitright = &splitright set splitbelow splitright @@ -188,541 +190,13 @@ set winminheight=0 set winheight=1 set winminwidth=0 set winwidth=1 -exe 'vert 1resize ' . ((&columns * 31 + 101) / 203) -exe 'vert 2resize ' . ((&columns * 85 + 101) / 203) -exe 'vert 3resize ' . ((&columns * 85 + 101) / 203) -argglobal -enew -file NERD_tree_tab_1 -balt src/ViewModel/Chat/chatViewModel.ts -let s:cpo_save=&cpo -set cpo&vim -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap  :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap  :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap ? :call nerdtree#ui_glue#invokeKeyMap("?") -nnoremap A :call nerdtree#ui_glue#invokeKeyMap("A") -nnoremap B :call nerdtree#ui_glue#invokeKeyMap("B") -nnoremap C :call nerdtree#ui_glue#invokeKeyMap("C") -nnoremap CD :call nerdtree#ui_glue#invokeKeyMap("CD") -nnoremap D :call nerdtree#ui_glue#invokeKeyMap("D") -nnoremap FL :call nerdtree#ui_glue#invokeKeyMap("FL") -nnoremap F :call nerdtree#ui_glue#invokeKeyMap("F") -nnoremap I :call nerdtree#ui_glue#invokeKeyMap("I") -nnoremap J :call nerdtree#ui_glue#invokeKeyMap("J") -nnoremap K :call nerdtree#ui_glue#invokeKeyMap("K") -nnoremap O :call nerdtree#ui_glue#invokeKeyMap("O") -nnoremap P :call nerdtree#ui_glue#invokeKeyMap("P") -nnoremap R :call nerdtree#ui_glue#invokeKeyMap("R") -nnoremap T :call nerdtree#ui_glue#invokeKeyMap("T") -nnoremap U :call nerdtree#ui_glue#invokeKeyMap("U") -nnoremap X :call nerdtree#ui_glue#invokeKeyMap("X") -nmap [c (GitGutterPrevHunk) -nmap \hp (GitGutterPreviewHunk) -nmap \hu (GitGutterUndoHunk) -nmap \hs (GitGutterStageHunk) -xmap \hs (GitGutterStageHunk) -nmap ]c (GitGutterNextHunk) -xmap ac (GitGutterTextObjectOuterVisual) -omap ac (GitGutterTextObjectOuterPending) -nnoremap cd :call nerdtree#ui_glue#invokeKeyMap("cd") -nnoremap e :call nerdtree#ui_glue#invokeKeyMap("e") -nnoremap f :call nerdtree#ui_glue#invokeKeyMap("f") -nnoremap go :call nerdtree#ui_glue#invokeKeyMap("go") -nnoremap gb :call nerdtree#ui_glue#invokeKeyMap("gb") -nnoremap gi :call nerdtree#ui_glue#invokeKeyMap("gi") -nnoremap gs :call nerdtree#ui_glue#invokeKeyMap("gs") -xmap ic (GitGutterTextObjectInnerVisual) -omap ic (GitGutterTextObjectInnerPending) -nnoremap i :call nerdtree#ui_glue#invokeKeyMap("i") -nnoremap m :call nerdtree#ui_glue#invokeKeyMap("m") -nnoremap o :call nerdtree#ui_glue#invokeKeyMap("o") -nnoremap p :call nerdtree#ui_glue#invokeKeyMap("p") -nnoremap q :call nerdtree#ui_glue#invokeKeyMap("q") -nnoremap r :call nerdtree#ui_glue#invokeKeyMap("r") -nnoremap s :call nerdtree#ui_glue#invokeKeyMap("s") -nnoremap t :call nerdtree#ui_glue#invokeKeyMap("t") -nnoremap u :call nerdtree#ui_glue#invokeKeyMap("u") -nnoremap x :call nerdtree#ui_glue#invokeKeyMap("x") -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap <2-LeftMouse> :call nerdtree#ui_glue#invokeKeyMap("<2-LeftMouse>") -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -let &cpo=s:cpo_save -unlet s:cpo_save -setlocal keymap= -setlocal noarabic -setlocal noautoindent -setlocal backupcopy= -setlocal balloonexpr= -setlocal nobinary -setlocal nobreakindent -setlocal breakindentopt= -setlocal bufhidden=hide -setlocal nobuflisted -setlocal buftype=nofile -setlocal nocindent -setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e -setlocal cinoptions= -setlocal cinscopedecls=public,protected,private -setlocal cinwords=if,else,while,do,for,switch -setlocal colorcolumn= -setlocal comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:- -setlocal commentstring=/*%s*/ -setlocal complete=.,w,b,u,t,i -setlocal concealcursor=nvic -setlocal conceallevel=2 -setlocal completefunc= -setlocal nocopyindent -setlocal cryptmethod= -setlocal nocursorbind -setlocal nocursorcolumn -setlocal cursorline -setlocal cursorlineopt=both -setlocal define= -setlocal dictionary= -setlocal nodiff -setlocal equalprg= -setlocal errorformat= -setlocal noexpandtab -if &filetype != 'nerdtree' -setlocal filetype=nerdtree -endif -setlocal fillchars= -setlocal fixendofline -setlocal foldcolumn=0 -setlocal nofoldenable -setlocal foldexpr=0 -setlocal foldignore=# -setlocal foldlevel=0 -setlocal foldmarker={{{,}}} -setlocal foldmethod=manual -setlocal foldminlines=1 -setlocal foldnestmax=20 -setlocal foldtext=foldtext() -setlocal formatexpr= -setlocal formatoptions=tcq -setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* -setlocal formatprg= -setlocal grepprg= -setlocal iminsert=0 -setlocal imsearch=-1 -setlocal include= -setlocal includeexpr= -setlocal indentexpr= -setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e -setlocal noinfercase -setlocal iskeyword=@,48-57,_,192-255 -setlocal keywordprg= -setlocal nolinebreak -setlocal nolisp -setlocal lispoptions= -setlocal lispwords= -setlocal nolist -setlocal listchars= -setlocal makeencoding= -setlocal makeprg= -setlocal matchpairs=(:),{:},[:] -setlocal nomodeline -setlocal nomodifiable -setlocal nrformats=bin,octal,hex -set number -setlocal nonumber -setlocal numberwidth=4 -setlocal omnifunc= -setlocal path= -setlocal nopreserveindent -setlocal nopreviewwindow -setlocal quoteescape=\\ -setlocal readonly -setlocal norelativenumber -setlocal norightleft -setlocal rightleftcmd=search -setlocal noscrollbind -setlocal scrolloff=-1 -setlocal shiftwidth=4 -setlocal noshortname -setlocal showbreak= -setlocal sidescrolloff=-1 -set signcolumn=yes -setlocal signcolumn=yes -setlocal nosmartindent -setlocal nosmoothscroll -setlocal softtabstop=0 -setlocal nospell -setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ -setlocal spellfile= -setlocal spelllang=en -setlocal spelloptions= -setlocal statusline=%{exists('b:NERDTree')?b:NERDTree.root.path.str():''} -setlocal suffixesadd= -setlocal noswapfile -setlocal synmaxcol=3000 -if &syntax != 'nerdtree' -setlocal syntax=nerdtree -endif -setlocal tabstop=8 -setlocal tagcase= -setlocal tagfunc= -setlocal tags= -setlocal termwinkey= -setlocal termwinscroll=10000 -setlocal termwinsize= -setlocal textwidth=0 -setlocal thesaurus= -setlocal thesaurusfunc= -setlocal noundofile -setlocal undolevels=-123456 -setlocal varsofttabstop= -setlocal vartabstop= -setlocal virtualedit= -setlocal wincolor= -setlocal nowinfixheight -setlocal winfixwidth -setlocal nowrap -setlocal wrapmargin=0 -wincmd w -argglobal -balt src/View/ChatPages/messagePage.css -let s:cpo_save=&cpo -set cpo&vim -nmap [c (GitGutterPrevHunk) -nmap \hp (GitGutterPreviewHunk) -nmap \hu (GitGutterUndoHunk) -nmap \hs (GitGutterStageHunk) -xmap \hs (GitGutterStageHunk) -nmap ]c (GitGutterNextHunk) -xmap ac (GitGutterTextObjectOuterVisual) -omap ac (GitGutterTextObjectOuterPending) -xmap ic (GitGutterTextObjectInnerVisual) -omap ic (GitGutterTextObjectInnerPending) -let &cpo=s:cpo_save -unlet s:cpo_save -setlocal keymap= -setlocal noarabic -setlocal autoindent -setlocal backupcopy= -setlocal balloonexpr= -setlocal nobinary -setlocal nobreakindent -setlocal breakindentopt= -setlocal bufhidden= -setlocal buflisted -setlocal buftype= -setlocal nocindent -setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e -setlocal cinoptions= -setlocal cinscopedecls=public,protected,private -setlocal cinwords=if,else,while,do,for,switch -setlocal colorcolumn= -setlocal comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:- -setlocal commentstring=//\ %s -setlocal complete=.,w,b,u,t,i -setlocal concealcursor= -setlocal conceallevel=0 -setlocal completefunc= -setlocal nocopyindent -setlocal cryptmethod= -setlocal nocursorbind -setlocal nocursorcolumn -setlocal nocursorline -setlocal cursorlineopt=both -setlocal define= -setlocal dictionary= -setlocal nodiff -setlocal equalprg= -setlocal errorformat=%+A\ %#%f\ %#(%l\\,%c):\ %m,%C%m -setlocal noexpandtab -if &filetype != 'typescriptreact' -setlocal filetype=typescriptreact -endif -setlocal fillchars= -setlocal fixendofline -setlocal foldcolumn=0 -setlocal foldenable -setlocal foldexpr=0 -setlocal foldignore=# -setlocal foldlevel=0 -setlocal foldmarker={{{,}}} -setlocal foldmethod=manual -setlocal foldminlines=1 -setlocal foldnestmax=20 -setlocal foldtext=foldtext() -setlocal formatexpr= -setlocal formatoptions=croql -setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* -setlocal formatprg= -setlocal grepprg= -setlocal iminsert=0 -setlocal imsearch=-1 -setlocal include= -setlocal includeexpr= -setlocal indentexpr=GetTsxIndent() -setlocal indentkeys=0{,0},0),0],0,,!^F,o,O,e,*,<>>,<<>,/ -setlocal noinfercase -setlocal iskeyword=@,48-57,_,192-255,$ -setlocal keywordprg= -setlocal nolinebreak -setlocal nolisp -setlocal lispoptions= -setlocal lispwords= -setlocal nolist -setlocal listchars= -setlocal makeencoding= -setlocal makeprg=tsc\ \ $*\ % -setlocal matchpairs=(:),{:},[:] -setlocal nomodeline -setlocal modifiable -setlocal nrformats=bin,octal,hex -set number -setlocal number -setlocal numberwidth=4 -setlocal omnifunc= -setlocal path= -setlocal nopreserveindent -setlocal nopreviewwindow -setlocal quoteescape=\\ -setlocal noreadonly -setlocal norelativenumber -setlocal norightleft -setlocal rightleftcmd=search -setlocal noscrollbind -setlocal scrolloff=-1 -setlocal shiftwidth=4 -setlocal noshortname -setlocal showbreak= -setlocal sidescrolloff=-1 -set signcolumn=yes -setlocal signcolumn=yes -setlocal nosmartindent -setlocal nosmoothscroll -setlocal softtabstop=0 -setlocal nospell -setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ -setlocal spellfile= -setlocal spelllang=en -setlocal spelloptions= -setlocal statusline= -setlocal suffixesadd=.ts,.tsx -setlocal swapfile -setlocal synmaxcol=3000 -if &syntax != 'typescriptreact' -setlocal syntax=typescriptreact -endif -setlocal tabstop=8 -setlocal tagcase= -setlocal tagfunc= -setlocal tags= -setlocal termwinkey= -setlocal termwinscroll=10000 -setlocal termwinsize= -setlocal textwidth=0 -setlocal thesaurus= -setlocal thesaurusfunc= -setlocal noundofile -setlocal undolevels=-123456 -setlocal varsofttabstop= -setlocal vartabstop= -setlocal virtualedit= -setlocal wincolor= -setlocal nowinfixheight -setlocal nowinfixwidth -setlocal wrap -setlocal wrapmargin=0 -silent! normal! zE -let &fdl = &fdl -let s:l = 81 - ((12 * winheight(0) + 18) / 37) -if s:l < 1 | let s:l = 1 | endif -keepjumps exe s:l -normal! zt -keepjumps 81 -normal! 016| -wincmd w -argglobal -if bufexists(fnamemodify("src/View/Components/replyViewHeader.tsx", ":p")) | buffer src/View/Components/replyViewHeader.tsx | else | edit src/View/Components/replyViewHeader.tsx | endif -balt src/View/Modals/chatMessageInfoModal.tsx -let s:cpo_save=&cpo -set cpo&vim -nmap [c (GitGutterPrevHunk) -nmap \hp (GitGutterPreviewHunk) -nmap \hu (GitGutterUndoHunk) -nmap \hs (GitGutterStageHunk) -xmap \hs (GitGutterStageHunk) -nmap ]c (GitGutterNextHunk) -xmap ac (GitGutterTextObjectOuterVisual) -omap ac (GitGutterTextObjectOuterPending) -xmap ic (GitGutterTextObjectInnerVisual) -omap ic (GitGutterTextObjectInnerPending) -let &cpo=s:cpo_save -unlet s:cpo_save -setlocal keymap= -setlocal noarabic -setlocal autoindent -setlocal backupcopy= -setlocal balloonexpr= -setlocal nobinary -setlocal nobreakindent -setlocal breakindentopt= -setlocal bufhidden= -setlocal buflisted -setlocal buftype= -setlocal nocindent -setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e -setlocal cinoptions= -setlocal cinscopedecls=public,protected,private -setlocal cinwords=if,else,while,do,for,switch -setlocal colorcolumn= -setlocal comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:- -setlocal commentstring=//\ %s -setlocal complete=.,w,b,u,t,i -setlocal concealcursor= -setlocal conceallevel=0 -setlocal completefunc= -setlocal nocopyindent -setlocal cryptmethod= -setlocal nocursorbind -setlocal nocursorcolumn -setlocal nocursorline -setlocal cursorlineopt=both -setlocal define= -setlocal dictionary= -setlocal nodiff -setlocal equalprg= -setlocal errorformat=%+A\ %#%f\ %#(%l\\,%c):\ %m,%C%m -setlocal noexpandtab -if &filetype != 'typescriptreact' -setlocal filetype=typescriptreact -endif -setlocal fillchars= -setlocal fixendofline -setlocal foldcolumn=0 -setlocal foldenable -setlocal foldexpr=0 -setlocal foldignore=# -setlocal foldlevel=0 -setlocal foldmarker={{{,}}} -setlocal foldmethod=manual -setlocal foldminlines=1 -setlocal foldnestmax=20 -setlocal foldtext=foldtext() -setlocal formatexpr= -setlocal formatoptions=croql -setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* -setlocal formatprg= -setlocal grepprg= -setlocal iminsert=0 -setlocal imsearch=-1 -setlocal include= -setlocal includeexpr= -setlocal indentexpr=GetTsxIndent() -setlocal indentkeys=0{,0},0),0],0,,!^F,o,O,e,*,<>>,<<>,/ -setlocal noinfercase -setlocal iskeyword=@,48-57,_,192-255,$ -setlocal keywordprg= -setlocal nolinebreak -setlocal nolisp -setlocal lispoptions= -setlocal lispwords= -setlocal nolist -setlocal listchars= -setlocal makeencoding= -setlocal makeprg=tsc\ \ $*\ % -setlocal matchpairs=(:),{:},[:] -setlocal nomodeline -setlocal modifiable -setlocal nrformats=bin,octal,hex -set number -setlocal number -setlocal numberwidth=4 -setlocal omnifunc= -setlocal path= -setlocal nopreserveindent -setlocal nopreviewwindow -setlocal quoteescape=\\ -setlocal noreadonly -setlocal norelativenumber -setlocal norightleft -setlocal rightleftcmd=search -setlocal noscrollbind -setlocal scrolloff=-1 -setlocal shiftwidth=4 -setlocal noshortname -setlocal showbreak= -setlocal sidescrolloff=-1 -set signcolumn=yes -setlocal signcolumn=yes -setlocal nosmartindent -setlocal nosmoothscroll -setlocal softtabstop=0 -setlocal nospell -setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ -setlocal spellfile= -setlocal spelllang=en -setlocal spelloptions= -setlocal statusline= -setlocal suffixesadd=.ts,.tsx -setlocal swapfile -setlocal synmaxcol=3000 -if &syntax != 'typescriptreact' -setlocal syntax=typescriptreact -endif -setlocal tabstop=8 -setlocal tagcase= -setlocal tagfunc= -setlocal tags= -setlocal termwinkey= -setlocal termwinscroll=10000 -setlocal termwinsize= -setlocal textwidth=0 -setlocal thesaurus= -setlocal thesaurusfunc= -setlocal noundofile -setlocal undolevels=-123456 -setlocal varsofttabstop= -setlocal vartabstop= -setlocal virtualedit= -setlocal wincolor= -setlocal nowinfixheight -setlocal nowinfixwidth -setlocal wrap -setlocal wrapmargin=0 -silent! normal! zE -let &fdl = &fdl -let s:l = 8 - ((7 * winheight(0) + 18) / 37) -if s:l < 1 | let s:l = 1 | endif -keepjumps exe s:l -normal! zt -keepjumps 8 -normal! 021| -wincmd w -exe 'vert 1resize ' . ((&columns * 31 + 101) / 203) -exe 'vert 2resize ' . ((&columns * 85 + 101) / 203) -exe 'vert 3resize ' . ((&columns * 85 + 101) / 203) -tabnext -edit src/ViewModel/Pages/messagePageViewModel.ts -let s:save_splitbelow = &splitbelow -let s:save_splitright = &splitright -set splitbelow splitright -wincmd _ | wincmd | -vsplit -1wincmd h -wincmd w -let &splitbelow = s:save_splitbelow -let &splitright = s:save_splitright -wincmd t -let s:save_winminheight = &winminheight -let s:save_winminwidth = &winminwidth -set winminheight=0 -set winheight=1 -set winminwidth=0 -set winwidth=1 -exe 'vert 1resize ' . ((&columns * 31 + 101) / 203) -exe 'vert 2resize ' . ((&columns * 171 + 101) / 203) +exe 'vert 1resize ' . ((&columns * 31 + 105) / 211) +exe 'vert 2resize ' . ((&columns * 89 + 105) / 211) +exe 'vert 3resize ' . ((&columns * 89 + 105) / 211) argglobal enew file NERD_tree_tab_2 -balt src/Model/Chat/chatModel.ts +balt src/index.tsx let s:cpo_save=&cpo set cpo&vim nnoremap :call nerdtree#ui_glue#invokeKeyMap("") @@ -912,13 +386,9 @@ setlocal nowrap setlocal wrapmargin=0 wincmd w argglobal -balt src/Model/Chat/chatModel.ts +balt dist/sw.js let s:cpo_save=&cpo set cpo&vim -imap :call coc#snippet#jump(0, 0) -imap :call coc#snippet#jump(1, 0) -smap :call coc#snippet#jump(1, 0) -smap  :call coc#snippet#jump(0, 0) nmap [c (GitGutterPrevHunk) nmap \hp (GitGutterPreviewHunk) nmap \hu (GitGutterUndoHunk) @@ -929,10 +399,6 @@ xmap ac (GitGutterTextObjectOuterVisual) omap ac (GitGutterTextObjectOuterPending) xmap ic (GitGutterTextObjectInnerVisual) omap ic (GitGutterTextObjectInnerPending) -smap :call coc#snippet#jump(0, 0) -smap :call coc#snippet#jump(1, 0) -imap :call coc#snippet#jump(1, 0) -imap  :call coc#snippet#jump(0, 0) let &cpo=s:cpo_save unlet s:cpo_save setlocal keymap= @@ -952,8 +418,8 @@ setlocal cinoptions= setlocal cinscopedecls=public,protected,private setlocal cinwords=if,else,while,do,for,switch setlocal colorcolumn= -setlocal comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:- -setlocal commentstring=//\ %s +setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//%s setlocal complete=.,w,b,u,t,i setlocal concealcursor= setlocal conceallevel=0 @@ -964,14 +430,14 @@ setlocal nocursorbind setlocal nocursorcolumn setlocal nocursorline setlocal cursorlineopt=both -setlocal define= +setlocal define=\\(^\\s*(*async\\s\\+function\\|(*function\\)\\|^\\s*\\(\\*\\|static\\|async\\|get\\|set\\|\\i\\+\\.\\)\\|^\\s*\\(\\ze\\i\\+\\)\\(([^)]*).*{$\\|\\s*[:=,]\\)\\|^\\s*\\(export\\s\\+\\|export\\s\\+default\\s\\+\\)*\\(var\\|let\\|const\\|function\\|class\\)\\|\\ setlocal dictionary= setlocal nodiff setlocal equalprg= -setlocal errorformat=%+A\ %#%f\ %#(%l\\,%c):\ %m,%C%m +setlocal errorformat= setlocal noexpandtab -if &filetype != 'typescript' -setlocal filetype=typescript +if &filetype != 'javascript' +setlocal filetype=javascript endif setlocal fillchars= setlocal fixendofline @@ -994,10 +460,10 @@ setlocal iminsert=0 setlocal imsearch=-1 setlocal include= setlocal includeexpr= -setlocal indentexpr=GetTypescriptIndent() +setlocal indentexpr=GetJavascriptIndent() setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e,0],0) setlocal noinfercase -setlocal iskeyword=@,48-57,_,192-255,$ +setlocal iskeyword=@,48-57,_,192-255 setlocal keywordprg= setlocal nolinebreak setlocal nolisp @@ -1006,7 +472,7 @@ setlocal lispwords= setlocal nolist setlocal listchars= setlocal makeencoding= -setlocal makeprg=tsc\ \ $*\ % +setlocal makeprg= setlocal matchpairs=(:),{:},[:] setlocal nomodeline setlocal modifiable @@ -1014,8 +480,8 @@ setlocal nrformats=bin,octal,hex set number setlocal number setlocal numberwidth=4 -setlocal omnifunc= -setlocal path= +setlocal omnifunc=javascriptcomplete#CompleteJS +setlocal path=.,, setlocal nopreserveindent setlocal nopreviewwindow setlocal quoteescape=\\ @@ -1040,11 +506,11 @@ setlocal spellfile= setlocal spelllang=en setlocal spelloptions= setlocal statusline= -setlocal suffixesadd=.ts,.tsx +setlocal suffixesadd=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json setlocal swapfile setlocal synmaxcol=3000 -if &syntax != 'typescript' -setlocal syntax=typescript +if &syntax != 'javascript' +setlocal syntax=javascript endif setlocal tabstop=8 setlocal tagcase= @@ -1068,17 +534,176 @@ setlocal wrap setlocal wrapmargin=0 silent! normal! zE let &fdl = &fdl -let s:l = 20 - ((19 * winheight(0) + 18) / 37) +let s:l = 18 - ((17 * winheight(0) + 18) / 37) +if s:l < 1 | let s:l = 1 | endif +keepjumps exe s:l +normal! zt +keepjumps 18 +normal! $ +wincmd w +argglobal +if bufexists(fnamemodify("build/support.js", ":p")) | buffer build/support.js | else | edit build/support.js | endif +balt src/Model/Utility/utility.ts +let s:cpo_save=&cpo +set cpo&vim +nmap [c (GitGutterPrevHunk) +nmap \hp (GitGutterPreviewHunk) +nmap \hu (GitGutterUndoHunk) +nmap \hs (GitGutterStageHunk) +xmap \hs (GitGutterStageHunk) +nmap ]c (GitGutterNextHunk) +xmap ac (GitGutterTextObjectOuterVisual) +omap ac (GitGutterTextObjectOuterPending) +xmap ic (GitGutterTextObjectInnerVisual) +omap ic (GitGutterTextObjectInnerPending) +let &cpo=s:cpo_save +unlet s:cpo_save +setlocal keymap= +setlocal noarabic +setlocal autoindent +setlocal backupcopy= +setlocal balloonexpr= +setlocal nobinary +setlocal nobreakindent +setlocal breakindentopt= +setlocal bufhidden= +setlocal buflisted +setlocal buftype= +setlocal nocindent +setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e +setlocal cinoptions= +setlocal cinscopedecls=public,protected,private +setlocal cinwords=if,else,while,do,for,switch +setlocal colorcolumn= +setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//%s +setlocal complete=.,w,b,u,t,i +setlocal concealcursor= +setlocal conceallevel=0 +setlocal completefunc= +setlocal nocopyindent +setlocal cryptmethod= +setlocal nocursorbind +setlocal nocursorcolumn +setlocal nocursorline +setlocal cursorlineopt=both +setlocal define=\\(^\\s*(*async\\s\\+function\\|(*function\\)\\|^\\s*\\(\\*\\|static\\|async\\|get\\|set\\|\\i\\+\\.\\)\\|^\\s*\\(\\ze\\i\\+\\)\\(([^)]*).*{$\\|\\s*[:=,]\\)\\|^\\s*\\(export\\s\\+\\|export\\s\\+default\\s\\+\\)*\\(var\\|let\\|const\\|function\\|class\\)\\|\\ +setlocal dictionary= +setlocal nodiff +setlocal equalprg= +setlocal errorformat= +setlocal noexpandtab +if &filetype != 'javascript' +setlocal filetype=javascript +endif +setlocal fillchars= +setlocal fixendofline +setlocal foldcolumn=0 +setlocal foldenable +setlocal foldexpr=0 +setlocal foldignore=# +setlocal foldlevel=0 +setlocal foldmarker={{{,}}} +setlocal foldmethod=manual +setlocal foldminlines=1 +setlocal foldnestmax=20 +setlocal foldtext=foldtext() +setlocal formatexpr= +setlocal formatoptions=croql +setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* +setlocal formatprg= +setlocal grepprg= +setlocal iminsert=0 +setlocal imsearch=-1 +setlocal include= +setlocal includeexpr= +setlocal indentexpr=GetJavascriptIndent() +setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e,0],0) +setlocal noinfercase +setlocal iskeyword=@,48-57,_,192-255 +setlocal keywordprg= +setlocal nolinebreak +setlocal nolisp +setlocal lispoptions= +setlocal lispwords= +setlocal nolist +setlocal listchars= +setlocal makeencoding= +setlocal makeprg= +setlocal matchpairs=(:),{:},[:] +setlocal nomodeline +setlocal modifiable +setlocal nrformats=bin,octal,hex +set number +setlocal number +setlocal numberwidth=4 +setlocal omnifunc=javascriptcomplete#CompleteJS +setlocal path=.,, +setlocal nopreserveindent +setlocal nopreviewwindow +setlocal quoteescape=\\ +setlocal noreadonly +setlocal norelativenumber +setlocal norightleft +setlocal rightleftcmd=search +setlocal noscrollbind +setlocal scrolloff=-1 +setlocal shiftwidth=4 +setlocal noshortname +setlocal showbreak= +setlocal sidescrolloff=-1 +set signcolumn=yes +setlocal signcolumn=yes +setlocal nosmartindent +setlocal nosmoothscroll +setlocal softtabstop=0 +setlocal nospell +setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ +setlocal spellfile= +setlocal spelllang=en +setlocal spelloptions= +setlocal statusline= +setlocal suffixesadd=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json +setlocal swapfile +setlocal synmaxcol=3000 +if &syntax != 'javascript' +setlocal syntax=javascript +endif +setlocal tabstop=8 +setlocal tagcase= +setlocal tagfunc= +setlocal tags= +setlocal termwinkey= +setlocal termwinscroll=10000 +setlocal termwinsize= +setlocal textwidth=0 +setlocal thesaurus= +setlocal thesaurusfunc= +setlocal noundofile +setlocal undolevels=-123456 +setlocal varsofttabstop= +setlocal vartabstop= +setlocal virtualedit= +setlocal wincolor= +setlocal nowinfixheight +setlocal nowinfixwidth +setlocal wrap +setlocal wrapmargin=0 +silent! normal! zE +let &fdl = &fdl +let s:l = 20 - ((10 * winheight(0) + 18) / 37) if s:l < 1 | let s:l = 1 | endif keepjumps exe s:l normal! zt keepjumps 20 -normal! 0156| +normal! 017| wincmd w -exe 'vert 1resize ' . ((&columns * 31 + 101) / 203) -exe 'vert 2resize ' . ((&columns * 171 + 101) / 203) +2wincmd w +exe 'vert 1resize ' . ((&columns * 31 + 105) / 211) +exe 'vert 2resize ' . ((&columns * 89 + 105) / 211) +exe 'vert 3resize ' . ((&columns * 89 + 105) / 211) tabnext -edit src/ViewModel/Global/coreViewModel.ts +edit src/View/homePage.tsx let s:save_splitbelow = &splitbelow let s:save_splitright = &splitright set splitbelow splitright @@ -1098,35 +723,13 @@ set winminheight=0 set winheight=1 set winminwidth=0 set winwidth=1 -exe 'vert 1resize ' . ((&columns * 31 + 101) / 203) -exe 'vert 2resize ' . ((&columns * 85 + 101) / 203) -exe 'vert 3resize ' . ((&columns * 85 + 101) / 203) +exe 'vert 1resize ' . ((&columns * 67 + 105) / 211) +exe 'vert 2resize ' . ((&columns * 67 + 105) / 211) +exe 'vert 3resize ' . ((&columns * 75 + 105) / 211) argglobal -enew -file NERD_tree_tab_3 balt src/View/translations.ts let s:cpo_save=&cpo set cpo&vim -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap  :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap  :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap ? :call nerdtree#ui_glue#invokeKeyMap("?") -nnoremap A :call nerdtree#ui_glue#invokeKeyMap("A") -nnoremap B :call nerdtree#ui_glue#invokeKeyMap("B") -nnoremap C :call nerdtree#ui_glue#invokeKeyMap("C") -nnoremap CD :call nerdtree#ui_glue#invokeKeyMap("CD") -nnoremap D :call nerdtree#ui_glue#invokeKeyMap("D") -nnoremap FL :call nerdtree#ui_glue#invokeKeyMap("FL") -nnoremap F :call nerdtree#ui_glue#invokeKeyMap("F") -nnoremap I :call nerdtree#ui_glue#invokeKeyMap("I") -nnoremap J :call nerdtree#ui_glue#invokeKeyMap("J") -nnoremap K :call nerdtree#ui_glue#invokeKeyMap("K") -nnoremap O :call nerdtree#ui_glue#invokeKeyMap("O") -nnoremap P :call nerdtree#ui_glue#invokeKeyMap("P") -nnoremap R :call nerdtree#ui_glue#invokeKeyMap("R") -nnoremap T :call nerdtree#ui_glue#invokeKeyMap("T") -nnoremap U :call nerdtree#ui_glue#invokeKeyMap("U") -nnoremap X :call nerdtree#ui_glue#invokeKeyMap("X") nmap [c (GitGutterPrevHunk) nmap \hp (GitGutterPreviewHunk) nmap \hu (GitGutterUndoHunk) @@ -1135,43 +738,21 @@ xmap \hs (GitGutterStageHunk) nmap ]c (GitGutterNextHunk) xmap ac (GitGutterTextObjectOuterVisual) omap ac (GitGutterTextObjectOuterPending) -nnoremap cd :call nerdtree#ui_glue#invokeKeyMap("cd") -nnoremap e :call nerdtree#ui_glue#invokeKeyMap("e") -nnoremap f :call nerdtree#ui_glue#invokeKeyMap("f") -nnoremap go :call nerdtree#ui_glue#invokeKeyMap("go") -nnoremap gb :call nerdtree#ui_glue#invokeKeyMap("gb") -nnoremap gi :call nerdtree#ui_glue#invokeKeyMap("gi") -nnoremap gs :call nerdtree#ui_glue#invokeKeyMap("gs") -nnoremap i :call nerdtree#ui_glue#invokeKeyMap("i") xmap ic (GitGutterTextObjectInnerVisual) omap ic (GitGutterTextObjectInnerPending) -nnoremap m :call nerdtree#ui_glue#invokeKeyMap("m") -nnoremap o :call nerdtree#ui_glue#invokeKeyMap("o") -nnoremap p :call nerdtree#ui_glue#invokeKeyMap("p") -nnoremap q :call nerdtree#ui_glue#invokeKeyMap("q") -nnoremap r :call nerdtree#ui_glue#invokeKeyMap("r") -nnoremap s :call nerdtree#ui_glue#invokeKeyMap("s") -nnoremap t :call nerdtree#ui_glue#invokeKeyMap("t") -nnoremap u :call nerdtree#ui_glue#invokeKeyMap("u") -nnoremap x :call nerdtree#ui_glue#invokeKeyMap("x") -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap <2-LeftMouse> :call nerdtree#ui_glue#invokeKeyMap("<2-LeftMouse>") -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") -nnoremap :call nerdtree#ui_glue#invokeKeyMap("") let &cpo=s:cpo_save unlet s:cpo_save setlocal keymap= setlocal noarabic -setlocal noautoindent +setlocal autoindent setlocal backupcopy= setlocal balloonexpr= setlocal nobinary setlocal nobreakindent setlocal breakindentopt= -setlocal bufhidden=hide -setlocal nobuflisted -setlocal buftype=nofile +setlocal bufhidden= +setlocal buflisted +setlocal buftype= setlocal nocindent setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e setlocal cinoptions= @@ -1179,30 +760,30 @@ setlocal cinscopedecls=public,protected,private setlocal cinwords=if,else,while,do,for,switch setlocal colorcolumn= setlocal comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:- -setlocal commentstring=/*%s*/ +setlocal commentstring=//\ %s setlocal complete=.,w,b,u,t,i -setlocal concealcursor=nvic -setlocal conceallevel=2 +setlocal concealcursor= +setlocal conceallevel=0 setlocal completefunc= setlocal nocopyindent setlocal cryptmethod= setlocal nocursorbind setlocal nocursorcolumn -setlocal cursorline +setlocal nocursorline setlocal cursorlineopt=both setlocal define= setlocal dictionary= setlocal nodiff setlocal equalprg= -setlocal errorformat= +setlocal errorformat=%+A\ %#%f\ %#(%l\\,%c):\ %m,%C%m setlocal noexpandtab -if &filetype != 'nerdtree' -setlocal filetype=nerdtree +if &filetype != 'typescriptreact' +setlocal filetype=typescriptreact endif setlocal fillchars= setlocal fixendofline setlocal foldcolumn=0 -setlocal nofoldenable +setlocal foldenable setlocal foldexpr=0 setlocal foldignore=# setlocal foldlevel=0 @@ -1212,7 +793,7 @@ setlocal foldminlines=1 setlocal foldnestmax=20 setlocal foldtext=foldtext() setlocal formatexpr= -setlocal formatoptions=tcq +setlocal formatoptions=croql setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* setlocal formatprg= setlocal grepprg= @@ -1220,10 +801,10 @@ setlocal iminsert=0 setlocal imsearch=-1 setlocal include= setlocal includeexpr= -setlocal indentexpr= -setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e +setlocal indentexpr=GetTsxIndent() +setlocal indentkeys=0{,0},0),0],0,,!^F,o,O,e,*,<>>,<<>,/ setlocal noinfercase -setlocal iskeyword=@,48-57,_,192-255 +setlocal iskeyword=@,48-57,_,192-255,$ setlocal keywordprg= setlocal nolinebreak setlocal nolisp @@ -1232,20 +813,20 @@ setlocal lispwords= setlocal nolist setlocal listchars= setlocal makeencoding= -setlocal makeprg= +setlocal makeprg=tsc\ \ $*\ % setlocal matchpairs=(:),{:},[:] setlocal nomodeline -setlocal nomodifiable +setlocal modifiable setlocal nrformats=bin,octal,hex set number -setlocal nonumber +setlocal number setlocal numberwidth=4 setlocal omnifunc= setlocal path= setlocal nopreserveindent setlocal nopreviewwindow setlocal quoteescape=\\ -setlocal readonly +setlocal noreadonly setlocal norelativenumber setlocal norightleft setlocal rightleftcmd=search @@ -1265,12 +846,12 @@ setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ setlocal spellfile= setlocal spelllang=en setlocal spelloptions= -setlocal statusline=%{exists('b:NERDTree')?b:NERDTree.root.path.str():''} -setlocal suffixesadd= -setlocal noswapfile +setlocal statusline= +setlocal suffixesadd=.ts,.tsx +setlocal swapfile setlocal synmaxcol=3000 -if &syntax != 'nerdtree' -setlocal syntax=nerdtree +if &syntax != 'typescriptreact' +setlocal syntax=typescriptreact endif setlocal tabstop=8 setlocal tagcase= @@ -1289,12 +870,21 @@ setlocal vartabstop= setlocal virtualedit= setlocal wincolor= setlocal nowinfixheight -setlocal winfixwidth -setlocal nowrap +setlocal nowinfixwidth +setlocal wrap setlocal wrapmargin=0 +silent! normal! zE +let &fdl = &fdl +let s:l = 21 - ((14 * winheight(0) + 18) / 37) +if s:l < 1 | let s:l = 1 | endif +keepjumps exe s:l +normal! zt +keepjumps 21 +normal! $ wincmd w argglobal -balt src/ViewModel/Pages/messagePageViewModel.ts +if bufexists(fnamemodify("src/ViewModel/Global/coreViewModel.ts", ":p")) | buffer src/ViewModel/Global/coreViewModel.ts | else | edit src/ViewModel/Global/coreViewModel.ts | endif +balt src/View/homePage.tsx let s:cpo_save=&cpo set cpo&vim nmap [c (GitGutterPrevHunk) @@ -1442,16 +1032,16 @@ setlocal wrap setlocal wrapmargin=0 silent! normal! zE let &fdl = &fdl -let s:l = 7 - ((3 * winheight(0) + 18) / 37) +let s:l = 12 - ((9 * winheight(0) + 18) / 37) if s:l < 1 | let s:l = 1 | endif keepjumps exe s:l normal! zt -keepjumps 7 -normal! $ +keepjumps 12 +normal! 012| wincmd w argglobal -if bufexists(fnamemodify("src/View/translations.ts", ":p")) | buffer src/View/translations.ts | else | edit src/View/translations.ts | endif -balt src/ViewModel/Global/coreViewModel.ts +if bufexists(fnamemodify("src/ViewModel/Global/coreViewModel.ts", ":p")) | buffer src/ViewModel/Global/coreViewModel.ts | else | edit src/ViewModel/Global/coreViewModel.ts | endif +balt src/View/homePage.tsx let s:cpo_save=&cpo set cpo&vim nmap [c (GitGutterPrevHunk) @@ -1599,18 +1189,17 @@ setlocal wrap setlocal wrapmargin=0 silent! normal! zE let &fdl = &fdl -let s:l = 15 - ((14 * winheight(0) + 18) / 37) +let s:l = 115 - ((25 * winheight(0) + 18) / 37) if s:l < 1 | let s:l = 1 | endif keepjumps exe s:l normal! zt -keepjumps 15 -normal! $ +keepjumps 115 +normal! 09| wincmd w -3wincmd w -exe 'vert 1resize ' . ((&columns * 31 + 101) / 203) -exe 'vert 2resize ' . ((&columns * 85 + 101) / 203) -exe 'vert 3resize ' . ((&columns * 85 + 101) / 203) -tabnext 3 +exe 'vert 1resize ' . ((&columns * 67 + 105) / 211) +exe 'vert 2resize ' . ((&columns * 67 + 105) / 211) +exe 'vert 3resize ' . ((&columns * 75 + 105) / 211) +tabnext 1 set stal=1 if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 silent exe 'bwipe ' . s:wipebuf diff --git a/dist/index.html b/dist/index.html index 49ace0c2..036893f6 100644 --- a/dist/index.html +++ b/dist/index.html @@ -15,7 +15,6 @@ - diff --git a/dist/index.js b/dist/index.js index 574711c9..dfbf090f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -353,6 +353,7 @@ settingsButton: "Settings", manageStorageButton: "Manage storage", transferDataButton: "Transfer or export data", + updateButton: (version) => `Update to ${version}`, scrollToChatButton: "Chats", /// backToOverviewAudioLabel: "go back to overview", @@ -596,6 +597,7 @@ settingsButton: "Einstellungen", manageStorageButton: "Daten verwalten", transferDataButton: "Daten \xFCbertragen", + updateButton: (version) => `Aktualisieren: ${version}`, scrollToChatButton: "Chats", backToOverviewAudioLabel: "zur\xFCck zur \xFCbersicht", chatsHeadline: "Chats", @@ -820,6 +822,7 @@ settingsButton: "Ajustes", manageStorageButton: "Gestionar almacenamiento", transferDataButton: "Enviar o exportar archivos", + updateButton: (version) => `Actualizar a ${version}`, scrollToChatButton: "Chats", backToOverviewAudioLabel: "volver al resumen", chatsHeadline: "Chats", @@ -1314,7 +1317,12 @@ this.connectionModel = connectionModel2; this.chatListModel = chatListModel2; this.fileTransferModel = fileTransferModel2; - this.BUILD = "Build 26.09.24.D"; + this.swRegistration = void 0; + this.version = new State(""); + this.latestVersion = new State(""); + this.noUpdateAvailable = createProxyState([this.latestVersion], () => { + return this.latestVersion.value == "" || this.latestVersion.value == this.version.value; + }); // CONTEXT this.contextStack = /* @__PURE__ */ new Map(); this.closeContext = (contextId, fromHistoryEvent = false) => { @@ -1356,12 +1364,46 @@ }; // DRAG & DROP this.draggedObject = new State(void 0); + // OFFLINE MODE & UPDATE + this.configureServiceWorker = async () => { + if ("serviceWorker" in navigator) { + try { + this.swRegistration = await navigator.serviceWorker.register( + "sw.js", + { + scope: "/" + } + ); + if (this.swRegistration.active) { + console.log("Service worker active"); + } + } catch (error) { + console.error(`Could not install service worker: ${error}`); + } + } + fetch("/version").then(async (response) => { + this.version.value = await response.text(); + }); + fetch("/latestVersion").then(async (response) => { + this.latestVersion.value = (await response.text()).replace("\n", ""); + console.log("LATEST", this.latestVersion.value); + }); + }; + this.update = async () => { + if (!this.swRegistration) return; + await this.swRegistration.update(); + window.location.reload(); + }; this.translations = allTranslations[settingsModel2.language] || allTranslations.en; document.body.addEventListener("keydown", this.handleKeyDown); window.onpopstate = () => { if (!this.context) return; this.closeContext(this.context.contextId, true); }; + this.configureServiceWorker(); + this.noUpdateAvailable.subscribe(() => { + console.log(this.noUpdateAvailable.value, this.latestVersion.value, this.version.value); + }); this.startChron(); this.chronHandlerManager.setHandler( "core-view-model", @@ -4955,6 +4997,7 @@ // src/View/homePage.tsx function HomePage(coreViewModel2, storageViewModel2, settingsViewModel2, connectionViewModel2, fileTransferViewModel2, chatListViewModel2) { + const updateText = createProxyState([coreViewModel2.latestVersion], () => coreViewModel2.translations.homePage.updateButton(coreViewModel2.latestVersion.value)); const overviewSection = /* @__PURE__ */ createElement("div", { id: "overview-section" }, /* @__PURE__ */ createElement("h2", null, coreViewModel2.translations.homePage.overviewHeadline), /* @__PURE__ */ createElement("label", { class: "tile flex-no" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "cell_tower"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, coreViewModel2.translations.homePage.serverAddress), /* @__PURE__ */ createElement( "input", { @@ -5029,6 +5072,20 @@ storageViewModel2.showStorageModal, coreViewModel2.translations.homePage.manageStorageButton, "hard_drive" + ), /* @__PURE__ */ createElement( + "button", + { + class: "primary", + "on:click": coreViewModel2.update, + "toggle:hidden": coreViewModel2.noUpdateAvailable + }, + /* @__PURE__ */ createElement( + "span", + { + "subscribe:innerText": updateText + } + ), + /* @__PURE__ */ createElement("span", { class: "icon" }, "update") ), /* @__PURE__ */ createElement("div", { class: "mobile-only" }, /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("div", { class: "flex-row justify-end" }, /* @__PURE__ */ createElement("button", { class: "ghost width-50", "on:click": scrollToChat }, coreViewModel2.translations.homePage.scrollToChatButton, /* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward"))))); const chatSection = /* @__PURE__ */ createElement("div", { id: "chat-section" }, /* @__PURE__ */ createElement("h2", null, coreViewModel2.translations.homePage.chatsHeadline), /* @__PURE__ */ createElement("div", { class: "flex-row width-input" }, /* @__PURE__ */ createElement( "input", @@ -7221,7 +7278,7 @@ return /* @__PURE__ */ createElement("div", { class: "slide-up" }, /* @__PURE__ */ createElement("h2", null, coreViewModel2.translations.homePage.appName), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("div", { class: "flex-column gap" }, InfoTile( "build", coreViewModel2.translations.settings.version, - settingsViewModel2.coreViewModel.BUILD + settingsViewModel2.coreViewModel.version ))); } function SettingsRegionalPane(coreViewModel2, settingsViewModel2) { diff --git a/dist/support.js b/dist/support.js deleted file mode 100644 index 8d839ed5..00000000 --- a/dist/support.js +++ /dev/null @@ -1,35 +0,0 @@ -// TABS -document.querySelector("main").addEventListener("scroll", () => { - const links = document.querySelectorAll(".tab-link"); - links.forEach((element) => element.removeAttribute("active")); - - const pageWidth = document.querySelector("main > article").offsetWidth; - const scroll = document.querySelector("main").scrollLeft; - const currentPage = Math.round(scroll / pageWidth); - - if (links[currentPage]) links[currentPage].setAttribute("active", ""); -}); - -// SERVICE WORKER -async function registerServiceWorker() { - if ("serviceWorker" in navigator) { - try { - const registration = await navigator.serviceWorker.register( - "/sw.js", - { - scope: "/", - }, - ); - if (registration.installing) { - setTimeout(() => window.location.reload(), 500); - } else if (registration.active) { - console.log("Service worker active"); - registration.update(); - } - } catch (error) { - console.error(`Could not install service worker: ${error}`); - } - } -} - -registerServiceWorker(); diff --git a/dist/sw.js b/dist/sw.js index d5d34c8b..d796792c 100644 --- a/dist/sw.js +++ b/dist/sw.js @@ -1,32 +1,53 @@ -const CACHE_VERSION = "3"; +const VERSION = "2610 Beta 1" -self.addEventListener("fetch", (event) => { - event.respondWith(handleRequest(event)); +function processUrl(event) { + const url = event.request.url; + const fileName = url.split("/").pop(); + return {url, fileName}; +} + +self.addEventListener("install", () => { + self.skipWaiting(); }); -async function handleRequest(event) { - const response = await getFromCache(event); - if (response) { - fetchAndCache(event); // Call this but don't await, allowing the cache to update in the background - return response; +self.addEventListener("fetch", async (event) => { + console.log(VERSION); + const {url, fileName}=processUrl(event); + event.respondWith(handleRequest(event, url, fileName)); +}); + +async function handleRequest(event, url, fileName) { + switch (fileName) { + case "version": + const response = new Response(VERSION); + return response; + case "latestVersion": + return await fetch("/version.txt", {cache: "no-cache"}) } - return fetchAndCache(event); + const response = await getFromCache(event); + + if (response) { + fetchAndCache(event, fileName); // Call this but don't await, allowing the cache to update in the background + return response; + } + return fetchAndCache(event, fileName); } async function getFromCache(event) { const request = event.request; - const cache = await caches.open(CACHE_VERSION); + const cache = await caches.open(VERSION); const response = await cache.match(request); return response; } -async function fetchAndCache(event) { +async function fetchAndCache(event, fileName) { const request = event.request; + const response = await fetch(request, { cache: "no-cache" }); if (response.status === 200) { - // Only cache successful responses - const cache = await caches.open(CACHE_VERSION); - cache.put(request, response.clone()); + // Only cache successful responses + const cache = await caches.open(VERSION); + await cache.put(request, response.clone()); } return response; } diff --git a/dist/version.txt b/dist/version.txt new file mode 100644 index 00000000..fb83658c --- /dev/null +++ b/dist/version.txt @@ -0,0 +1 @@ +2610 Beta 1 diff --git a/src/View/Modals/settingsModal.tsx b/src/View/Modals/settingsModal.tsx index 5095df8e..e69f705f 100644 --- a/src/View/Modals/settingsModal.tsx +++ b/src/View/Modals/settingsModal.tsx @@ -122,7 +122,7 @@ function SettingsInfoPane( {InfoTile( "build", coreViewModel.translations.settings.version, - settingsViewModel.coreViewModel.BUILD, + settingsViewModel.coreViewModel.version, )} diff --git a/src/View/homePage.tsx b/src/View/homePage.tsx index 7c27676a..2a466a6a 100644 --- a/src/View/homePage.tsx +++ b/src/View/homePage.tsx @@ -19,185 +19,198 @@ export function HomePage( chatListViewModel: ChatListViewModel, ) { // sections + const updateText = React.createProxyState([coreViewModel.latestVersion], ()=>coreViewModel.translations.homePage.updateButton(coreViewModel.latestVersion.value)); + const overviewSection = ( -
-

{coreViewModel.translations.homePage.overviewHeadline}

+
+

{coreViewModel.translations.homePage.overviewHeadline}

- + -
- - - -
+
+ + + +
-
+
- -
- -
+ +
+ +
-
+
- {HomePageButton( - settingsViewModel.showSettingsModal, - coreViewModel.translations.homePage.settingsButton, - "settings", - )} - {HomePageButton( - fileTransferViewModel.showDirectionSelectionModal, - coreViewModel.translations.homePage.transferDataButton, - "sync_alt", - )} - {HomePageButton( - storageViewModel.showStorageModal, - coreViewModel.translations.homePage.manageStorageButton, - "hard_drive", - )} + {HomePageButton( + settingsViewModel.showSettingsModal, + coreViewModel.translations.homePage.settingsButton, + "settings", + )} + {HomePageButton( + fileTransferViewModel.showDirectionSelectionModal, + coreViewModel.translations.homePage.transferDataButton, + "sync_alt", + )} + {HomePageButton( + storageViewModel.showStorageModal, + coreViewModel.translations.homePage.manageStorageButton, + "hard_drive", + )} -
-
+ -
- -
-
-
- ); +
+
- const chatSection = ( -
-

{coreViewModel.translations.homePage.chatsHeadline}

+
+ +
+
+
+); -
- - -
+const chatSection = ( +
+

{coreViewModel.translations.homePage.chatsHeadline}

-
-
- ); +
+ + +
- // methods - function scrollToChat() { - chatSection.scrollIntoView(); - } +
+
+); - // final - return ( -
-
- {overviewSection} - {chatSection} -
-
+// methods +function scrollToChat() { + chatSection.scrollIntoView(); +} + +// final +return ( +
+
+ {overviewSection} + {chatSection} +
+
); } diff --git a/src/View/translations.ts b/src/View/translations.ts index 87ae6c79..2a06210f 100644 --- a/src/View/translations.ts +++ b/src/View/translations.ts @@ -73,6 +73,8 @@ const englishTranslations = { manageStorageButton: "Manage storage", transferDataButton: "Transfer or export data", + updateButton: (version: string) => `Update to ${version}`, + scrollToChatButton: "Chats", /// @@ -411,6 +413,8 @@ export const allTranslations: { settingsButton: "Einstellungen", manageStorageButton: "Daten verwalten", transferDataButton: "Daten übertragen", + + updateButton: (version: string) => `Aktualisieren: ${version}`, scrollToChatButton: "Chats", @@ -716,6 +720,8 @@ export const allTranslations: { settingsButton: "Ajustes", manageStorageButton: "Gestionar almacenamiento", transferDataButton: "Enviar o exportar archivos", + + updateButton: (version: string) => `Actualizar a ${version}`, scrollToChatButton: "Chats", diff --git a/src/ViewModel/Global/coreViewModel.ts b/src/ViewModel/Global/coreViewModel.ts index 059647b8..2038f4b2 100644 --- a/src/ViewModel/Global/coreViewModel.ts +++ b/src/ViewModel/Global/coreViewModel.ts @@ -9,7 +9,13 @@ import ConnectionModel from "../../Model/Global/connectionModel"; import ChatListModel from "../../Model/Chat/chatListModel"; export default class CoreViewModel { - readonly BUILD = "Build 26.09.24.D"; + swRegistration: ServiceWorkerRegistration|undefined = undefined; + + version: React.State = new React.State(""); + latestVersion: React.State = new React.State(""); + noUpdateAvailable: React.State = React.createProxyState([this.latestVersion], () => { + return (this.latestVersion.value == "" || this.latestVersion.value == this.version.value) + }) translations: Translations; @@ -84,34 +90,72 @@ export default class CoreViewModel { // DRAG & DROP draggedObject: React.State = new React.State(undefined); + // OFFLINE MODE & UPDATE + configureServiceWorker = async (): Promise => { + if ("serviceWorker" in navigator) { + try { + this.swRegistration = await navigator.serviceWorker.register( + "sw.js", + { + scope: "/", + }, + ); + if (this.swRegistration.active) { + console.log("Service worker active"); + } + } catch (error) { + console.error(`Could not install service worker: ${error}`); + } + } + + fetch("/version").then(async response => { + this.version.value = await response.text(); + }); + fetch("/latestVersion").then(async response => { + this.latestVersion.value = (await response.text()).replace("\n", ""); + console.log("LATEST", this.latestVersion.value); + }) + } + + update = async (): Promise => { + if (!this.swRegistration) return; + await this.swRegistration.update(); + window.location.reload(); + } + // init constructor( - public readonly storageModel: StorageModel, - public readonly settingsModel: SettingsModel, - public readonly connectionModel: ConnectionModel, - public readonly chatListModel: ChatListModel, - public readonly fileTransferModel: FileTransferModel, + public readonly storageModel: StorageModel, + public readonly settingsModel: SettingsModel, + public readonly connectionModel: ConnectionModel, + public readonly chatListModel: ChatListModel, + public readonly fileTransferModel: FileTransferModel, ) { - this.translations = - allTranslations[settingsModel.language] || allTranslations.en; + this.translations = + allTranslations[settingsModel.language] || allTranslations.en; - document.body.addEventListener("keydown", this.handleKeyDown); + document.body.addEventListener("keydown", this.handleKeyDown); - window.onpopstate = () => { - if (!this.context) return; - this.closeContext(this.context.contextId, true); - }; + window.onpopstate = () => { + if (!this.context) return; + this.closeContext(this.context.contextId, true); + }; - this.startChron(); - this.chronHandlerManager.setHandler( - "core-view-model", - this.handleChron, - ); + this.configureServiceWorker(); + this.noUpdateAvailable.subscribe(() => { + console.log(this.noUpdateAvailable.value, this.latestVersion.value, this.version.value); + }) + + this.startChron(); + this.chronHandlerManager.setHandler( + "core-view-model", + this.handleChron, + ); } // util static checkIsKeystroke(e: KeyboardEvent): boolean { - return (e.metaKey || e.altKey) && e.ctrlKey; + return (e.metaKey || e.altKey) && e.ctrlKey; } } @@ -120,19 +164,19 @@ export class Context { keystrokes = new Map void>(); handleKeystroke = (e: KeyboardEvent): boolean => { - const fn: (() => void) | undefined = this.keystrokes.get( - e.key.toLowerCase(), - ); - if (!fn) return false; - fn(); - return true; + const fn: (() => void) | undefined = this.keystrokes.get( + e.key.toLowerCase(), + ); + if (!fn) return false; + fn(); + return true; }; close = (): void => {}; handleContextClose = (fromHistoryEvent: boolean): void => {}; registerKeyStroke = (key: string, fn: () => void): void => { - this.keystrokes.set(key, fn); + this.keystrokes.set(key, fn); }; constructor(public contextDebugDescription: string) {} @@ -143,45 +187,45 @@ export class ContextHost extends Context { currentContext = new React.State(undefined); get isOpen(): boolean { - return false; + return false; } get contextSelection(): T | undefined { - return undefined; + return undefined; } registerContext = (key: T, context: Context): void => { - this.contexts.set(key, context); + this.contexts.set(key, context); }; closeCurrentContext = (): void => { - if (this.currentContext.value) { - this.coreViewModel.closeContext( - this.currentContext.value.contextId, - ); - } - this.currentContext.value = undefined; + if (this.currentContext.value) { + this.coreViewModel.closeContext( + this.currentContext.value.contextId, + ); + } + this.currentContext.value = undefined; }; updateContexts = (): void => { - if (this.isOpen == false) return; + if (this.isOpen == false) return; - const selection = this.contextSelection; - if (!selection) return; - const selectedContext: Context | undefined = - this.contexts.get(selection); - if (!selectedContext) return; - if (selectedContext != this.currentContext.value) { - this.closeCurrentContext(); - } + const selection = this.contextSelection; + if (!selection) return; + const selectedContext: Context | undefined = + this.contexts.get(selection); + if (!selectedContext) return; + if (selectedContext != this.currentContext.value) { + this.closeCurrentContext(); + } - this.coreViewModel.context = selectedContext; - this.currentContext.value = selectedContext; + this.coreViewModel.context = selectedContext; + this.currentContext.value = selectedContext; }; constructor( - contextDebugDescription: string, - public coreViewModel: CoreViewModel, + contextDebugDescription: string, + public coreViewModel: CoreViewModel, ) { - super(contextDebugDescription); + super(contextDebugDescription); } }