Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/api/socketActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,19 @@ export const SocketActions = {
)
},

async serverSpoolmanProxyGetInfo () {
baseEmit(
'server.spoolman.proxy', {
params: {
request_method: 'GET',
path: '/v1/info',
use_v2_response: true
},
dispatch: 'spoolman/onInfo'
}
)
},

async serverSpoolmanProxyGetSettingCurrency () {
baseEmit(
'server.spoolman.proxy', {
Expand Down
79 changes: 59 additions & 20 deletions src/store/spoolman/actions.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import type { ActionTree } from 'vuex'
import type {
Spool,
SpoolmanInfo,
SpoolmanProxyResponse,
SpoolmanProxyResponseV2,
SpoolmanState,
WebsocketBasePayload,
WebsocketFilamentPayload,
Expand All @@ -12,9 +14,30 @@ import type { RootState } from '../types'
import { SocketActions } from '@/api/socketActions'
import { consola } from 'consola'
import { EventBus } from '@/eventBus'
import { gte, valid } from 'semver'

const logPrefix = '[SPOOLMAN]'

const payloadAsSpoolmanProxyResponseV2 = <T>(payload: SpoolmanProxyResponse<T>): SpoolmanProxyResponseV2<T> => {
if (
payload != null &&
typeof payload === 'object' &&
'error' in payload &&
'response' in payload
) {
if (payload.error != null) {
EventBus.$emit(typeof payload.error === 'string' ? payload.error : payload.error.message, { type: 'error' })
}

return payload
}

return {
error: null,
response: payload
}
}

export const actions: ActionTree<SpoolmanState, RootState> = {
/**
* Reset our store
Expand All @@ -29,7 +52,7 @@ export const actions: ActionTree<SpoolmanState, RootState> = {
async init () {
SocketActions.serverSpoolmanGetSpoolId()
SocketActions.serverSpoolmanProxyGetAvailableSpools()
SocketActions.serverSpoolmanProxyGetSettingCurrency()
SocketActions.serverSpoolmanProxyGetInfo()
},

async onActiveSpool ({ commit }, payload) {
Expand Down Expand Up @@ -111,39 +134,55 @@ export const actions: ActionTree<SpoolmanState, RootState> = {
commit('setAvailableSpools', spools)
},

async onStatusChanged ({ commit, dispatch }, payload: boolean) {
if (payload) {
// refresh data, connected state will be set on data retrieval
dispatch('init')
} else {
commit('setConnected', payload)
}
},

async onAvailableSpools ({ commit, dispatch }, payload: SpoolmanProxyResponse<Spool[]>) {
if ('error' in payload && 'response' in payload) {
if (payload.error != null) {
EventBus.$emit(typeof payload.error === 'string' ? payload.error : payload.error.message, { type: 'error' })
return
}
payload = payloadAsSpoolmanProxyResponseV2(payload)

payload = payload.response
if (payload.error != null) {
return
}

commit('setAvailableSpools', [...payload])
commit('setAvailableSpools', [...payload.response])

commit('setConnected', true)

dispatch('initializeWebsocketConnection')
},

async onStatusChanged ({ commit, dispatch }, payload) {
if (payload) {
// refresh data, connected state will be set on data retrieval
dispatch('init')
} else commit('setConnected', payload)
async onInfo ({ state, commit }, payload: SpoolmanProxyResponse<SpoolmanInfo>) {
payload = payloadAsSpoolmanProxyResponseV2(payload)

if (payload.error != null) {
return
}

commit('setInfo', payload.response)

if (
state.info &&
valid(state.info.version) &&
gte(state.info.version, '0.16.0')
) {
SocketActions.serverSpoolmanProxyGetSettingCurrency()
}
},

async onSettingCurrency ({ commit }, payload: SpoolmanProxyResponse<{ value: string }>) {
if ('error' in payload && 'response' in payload) {
if (payload.error != null) {
EventBus.$emit(typeof payload.error === 'string' ? payload.error : payload.error.message, { type: 'error' })
return
}
payload = payloadAsSpoolmanProxyResponseV2(payload)

payload = payload.response
if (payload.error != null) {
return
}

commit('setCurrency', payload)
commit('setCurrency', payload.response)
},

async initializeWebsocketConnection ({ state, rootState, dispatch }) {
Expand Down
5 changes: 5 additions & 0 deletions src/store/spoolman/mutations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { MutationTree } from 'vuex'
import { defaultState } from './state'
import type {
Spool,
SpoolmanInfo,
SpoolmanState,
SpoolSelectionDialogState
} from '@/store/spoolman/types'
Expand Down Expand Up @@ -32,6 +33,10 @@ export const mutations: MutationTree<SpoolmanState> = {
state.dialog = payload
},

setInfo (state, payload: SpoolmanInfo) {
state.info = payload
},

setCurrency (state, payload: { value: string }) {
state.currency = payload.value.replace(/^"|"$/g, '')
},
Expand Down
5 changes: 3 additions & 2 deletions src/store/spoolman/state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ import type { SpoolmanState } from '@/store/spoolman/types'

export const defaultState = (): SpoolmanState => {
return {
info: null,
availableSpools: [],
activeSpool: undefined,
currency: undefined,
activeSpool: null,
currency: null,
connected: false,
dialog: {
show: false
Expand Down
37 changes: 28 additions & 9 deletions src/store/spoolman/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,10 @@ export interface Spool {
}

export interface SpoolmanState {
info: SpoolmanInfo | null;
availableSpools: Spool[];
activeSpool?: number;
currency?: string;
activeSpool: number | null;
currency: string | null;
connected: boolean;
dialog: SpoolSelectionDialogState;
socket?: WebSocket;
Expand Down Expand Up @@ -87,12 +88,30 @@ export interface MacroWithSpoolId extends Macro {
}
}

export type SpoolmanProxyResponse<T> = T | {
response: T,
error: null
} | {
response: null,
export interface SpoolmanInfo {
version: string;
debug_mode: boolean;
automatic_backups: boolean;
data_dir: string;
logs_dir: string;
backups_dir: string;
db_type: string;
git_commit: string;
build_date: Date;
}

export interface SpoolmanProxyResponseV2Success<T> {
response: T;
error: null;
}

export interface SpoolmanProxyResponseV2Error {
response: null;
error: string | {
message: string
}
message: string;
};
}

export type SpoolmanProxyResponseV2<T> = SpoolmanProxyResponseV2Success<T> | SpoolmanProxyResponseV2Error

export type SpoolmanProxyResponse<T> = T | SpoolmanProxyResponseV2<T>