2026-04-06 09:24:22 +02:00
import Alpine from 'alpinejs' ;
import { logout , restoreSession , verifyConnection } from '../api/auth.js' ;
import { listKitchens } from '../api/kitchens.js' ;
import { APP _NAME } from './config.js' ;
import { createRouter , navigate } from './router.js' ;
import { createAppStore } from './store.js' ;
import { appShell } from '../components/app-shell.js' ;
2026-04-06 17:20:47 +02:00
import { navBar } from '../components/nav-bar.js' ;
2026-04-06 09:24:22 +02:00
import { registerFeatureData } from '../features/register.js' ;
async function installServiceWorker ( ) {
if ( 'serviceWorker' in navigator ) {
await navigator . serviceWorker . register ( '/service-worker.js' ) ;
}
}
export function bootstrapApp ( ) {
const store = createAppStore ( ) ;
Alpine . store ( 'app' , store ) ;
registerFeatureData ( Alpine , store ) ;
const appRoot = document . querySelector ( '#app' ) ;
appRoot . innerHTML = appShell ( APP _NAME ) ;
Alpine . initTree ( appRoot ) ;
2026-04-06 17:20:47 +02:00
const navRoot = document . querySelector ( '#app-nav' ) ;
function renderNav ( ) {
if ( ! navRoot ) {
return ;
}
if ( typeof Alpine . destroyTree === 'function' ) {
Alpine . destroyTree ( navRoot ) ;
}
navRoot . innerHTML = navBar ( APP _NAME ) ;
Alpine . initTree ( navRoot ) ;
}
2026-04-06 09:24:22 +02:00
const router = createRouter ( {
Alpine ,
store ,
outlet : document . querySelector ( '#route-view' ) ,
} ) ;
2026-04-06 18:31:31 +02:00
let authFailureHandled = false ;
2026-04-06 09:24:22 +02:00
2026-04-06 17:07:14 +02:00
function applyKitchens ( kitchens ) {
store . setKitchens ( kitchens ) ;
if ( ! store . activeKitchen && kitchens . length ) {
store . setActiveKitchen ( kitchens [ 0 ] ) ;
}
2026-04-06 17:20:47 +02:00
renderNav ( ) ;
2026-04-06 17:07:14 +02:00
return kitchens ;
}
2026-04-06 09:24:22 +02:00
window . _ _loncApp = {
navigate ,
async refreshKitchens ( ) {
2026-04-06 17:07:14 +02:00
return applyKitchens ( await listKitchens ( store ) ) ;
2026-04-06 09:24:22 +02:00
} ,
async restoreSession ( ) {
try {
2026-04-06 17:07:14 +02:00
const result = await restoreSession ( store ) ;
if ( result ? . kitchens ) {
applyKitchens ( result . kitchens ) ;
} else if ( store . isConnected ) {
2026-04-06 09:24:22 +02:00
await window . _ _loncApp . refreshKitchens ( ) ;
}
2026-04-06 18:31:31 +02:00
if ( store . isConnected ) {
authFailureHandled = false ;
}
2026-04-06 17:20:47 +02:00
renderNav ( ) ;
2026-04-06 09:24:22 +02:00
} catch ( error ) {
2026-04-06 17:20:47 +02:00
renderNav ( ) ;
2026-04-06 09:24:22 +02:00
if ( window . location . hash !== '#/login' ) {
navigate ( '/login' ) ;
}
}
} ,
async verifyConnection ( ) {
2026-04-06 17:07:14 +02:00
const result = await verifyConnection ( store ) ;
if ( result ? . kitchens ) {
applyKitchens ( result . kitchens ) ;
} else if ( store . isConnected ) {
2026-04-06 09:24:22 +02:00
await window . _ _loncApp . refreshKitchens ( ) ;
}
2026-04-06 18:31:31 +02:00
if ( store . isConnected ) {
authFailureHandled = false ;
}
2026-04-06 17:20:47 +02:00
renderNav ( ) ;
2026-04-06 17:07:14 +02:00
return result ;
2026-04-06 09:24:22 +02:00
} ,
2026-04-06 18:31:31 +02:00
handleAuthFailure ( error ) {
if ( ! store . session ? . applicationKey || ! store . session ? . hasValidated || authFailureHandled ) {
return ;
}
authFailureHandled = true ;
store . markSessionInvalid ( ) ;
renderNav ( ) ;
const status = error ? . status || error ? . cause ? . status ;
const message =
status === 401 || status === 403
? 'This application key is no longer accepted by Tryton. Please verify it again or disconnect and create a new key.'
: 'Authenticated requests are no longer succeeding. The application key may have been cancelled, or access is being denied by the server. Please reconnect or create a new key.' ;
store . addAlert ( {
type : 'warning' ,
timeout : 0 ,
message ,
} ) ;
navigate ( '/login' ) ;
window . setTimeout ( ( ) => router . render ( ) , 0 ) ;
} ,
2026-04-06 09:24:22 +02:00
async logout ( ) {
await logout ( store ) ;
2026-04-06 18:31:31 +02:00
authFailureHandled = false ;
2026-04-06 17:20:47 +02:00
renderNav ( ) ;
2026-04-06 09:24:22 +02:00
navigate ( '/login' ) ;
} ,
router ,
} ;
window . addEventListener ( 'online' , ( ) => {
store . addAlert ( { type : 'success' , message : 'Connection restored.' } ) ;
} ) ;
window . addEventListener ( 'offline' , ( ) => {
store . addAlert ( {
type : 'warning' ,
message : 'You are offline. Cached screens stay available, but API actions may fail.' ,
} ) ;
} ) ;
window . _ _loncApp
. restoreSession ( )
. finally ( ( ) => router . start ( ) )
. catch ( ( ) => router . start ( ) ) ;
2026-04-06 17:20:47 +02:00
renderNav ( ) ;
2026-04-06 09:24:22 +02:00
installServiceWorker ( ) . catch ( ( ) => {
store . addAlert ( {
type : 'warning' ,
message : 'PWA installation support could not be initialized.' ,
} ) ;
} ) ;
}