VUEX_TO_PINIA_MIGRATION - xopherdeep/do-it-for-the-xp GitHub Wiki
π Vuex β Pinia Migration Checklist
Status: π‘ In Progress
Last Updated: 2025-12-21
Goal: Complete removal of all Vuex dependencies in favor of Pinia stores
π¦ Available Pinia Stores
| Store | Location | What It Replaces |
|---|---|---|
useUserStore |
src/lib/store/stores/user.ts |
state.user, state.users, getUserById, usersAz, loadUsers |
useBattleStore |
src/lib/store/stores/battle.ts |
state.battle, battleState, battle actions |
useGameStore |
src/lib/store/stores/game.ts |
devMode, theme, userActions, entity collections |
useAudioStore |
src/lib/store/stores/audio.ts |
state.bgm, audio actions |
πΊοΈ Migration Mapping
Vuex β Pinia Translation Guide
| Vuex Pattern | Pinia Replacement |
|---|---|
import { useStore } from 'vuex' |
import { useUserStore } from '@/lib/store/stores/user' |
const store = useStore() |
const userStore = useUserStore() |
store.state.user |
userStore.currentUser |
store.state.users |
userStore.users |
store.getters.getUserById(id) |
userStore.getUserById(id) |
store.getters.usersAz |
userStore.usersAz |
store.getters.isLoggedIn |
userStore.currentUser.isAuthenticated |
store.dispatch('loadUsers') |
userStore.loadUsers() |
store.state.battle |
battleStore.active, battleStore.terrain, etc. |
store.getters.battleState('active') |
battleStore.active |
store.dispatch('enterBattle') |
battleStore.enterBattle() |
store.dispatch('startBattleTimer') |
battleStore.startBattleTimer() |
store.commit('ACTIVATE_BATTLE') |
battleStore.activateBattle() |
store.state.devMode |
gameStore.devMode |
store.commit('SET_DEV_MODE', val) |
gameStore.setDevMode(val) |
store.state.theme |
gameStore.theme |
store.dispatch('changeSoundFX', payload) |
gameStore.changeSoundFX(payload) |
store.state.bgm |
audioStore.bgm |
store.dispatch('changeBGM', payload) |
audioStore.changeBGM(payload) |
mapGetters(['getUserById']) |
Use composable: const userStore = useUserStore() |
mapState(['theme']) |
Destructure: const { theme } = gameStore |
mapActions(['loadUsers']) |
Direct call: userStore.loadUsers() |
β Migration Checklist
Phase 1: Critical Core Services
| File | Status | Notes |
|---|---|---|
src/router/guard.routes.ts |
β¬ TODO | Auth guards, battle state checks |
src/lib/services/battle/BattleService.ts |
β¬ TODO | Heavy store usage, needs Store type removal |
src/lib/services/battle/index.ts |
β¬ TODO | Store type export |
src/lib/engine/audio/routeMusic.ts |
β¬ TODO | BGM dispatch calls |
Phase 2: Main App & Settings
| File | Status | Notes |
|---|---|---|
src/app/App.ts |
β¬ TODO | Main app entry |
src/app/SideMenu/XpSupport/XpSupport.ts |
β DONE | Migrated to useGameStore |
src/app/SideMenu/XpSettings/components/ThemeSettings.vue |
β DONE | Migrated to useGameStore |
src/app/SideMenu/XpSettings/components/FamilySettings.vue |
β DONE | Migrated to useUserStore |
src/app/SideMenu/XpSettings/components/PartySettings.vue |
β DONE | Migrated to useUserStore |
src/app/SideMenu/XpSettings/components/RewardSettings.vue |
β DONE | Migrated to useUserStore |
src/app/SideMenu/XpSettings/components/NotificationSettings.vue |
β DONE | Migrated to useUserStore |
src/app/SideMenu/XpSettings/components/XpChoreSettings/ChoreSettings.ts |
β DONE | Migrated to useUserStore |
Phase 3: Game Master Views
| File | Status | Notes |
|---|---|---|
src/app/Admin/XpApprovals/XpApprovals.vue |
β DONE | Migrated to useUserStore |
src/app/Admin/XpChat/XpChat.ts |
β DONE | Migrated to useUserStore |
src/app/Admin/XpAccessories/components/XpCreateUpdateAccessory.vue |
β¬ TODO | mapGetters |
Phase 4: Player/Console Views
| File | Status | Notes |
|---|---|---|
src/app/Console/BattleField/BattleField.ts |
β¬ TODO | useStore, store.state.user |
src/app/Console/BattleField/hooks/useBattleEngine.ts |
β¬ TODO | Heavy store.state.user usage |
src/app/Console/MyPortal/UserHud/MyGoldPoints/MyGoldPoints.ts |
β¬ TODO | mapGetters, mapActions, useStore |
src/app/Console/MyPortal/UserProfile/UserProfile.ts |
β¬ TODO | mapGetters |
src/app/Console/MyPortal/HomeTown/AccessoryShop/AccessoryShop.ts |
β¬ TODO | mapGetters |
src/app/Console/MyPortal/HomeTown/HospitalHub/HospitalHub.ts |
β¬ TODO | mapGetters |
src/app/Console/MyPortal/HomeTown/HospitalHub/components/XpViewStats.vue |
β¬ TODO | useStore |
src/app/Console/MyPortal/HomeTown/BattleGround/BattleGround.ts |
β¬ TODO | mapState, this.$store |
src/app/Console/MyPortal/MyHome/MyFoods/MyFoods.ts |
β¬ TODO | useStore |
src/app/Console/WorldMap/WorldDesert/WorldDesert.ts |
β¬ TODO | useStore |
Phase 5: Components
| File | Status | Notes |
|---|---|---|
src/components/CardUserStats/CardUserStats.ts |
β¬ TODO | mapGetters |
Phase 6: Utils & Test Files (Low Priority)
| File | Status | Notes |
|---|---|---|
src/lib/utils/battleroom/BattleroomTestUtils.ts |
β¬ TODO | Test utility |
src/lib/utils/battleroom/index.ts |
β¬ TODO | Store type |
src/app/Console/BattleField/__tests__/BattleGround.spec.ts |
β¬ TODO | Test file |
src/views/Dev/BattleroomDevTools/BattleroomDevTools.vue |
β¬ TODO | Dev tools |
src/views/Dev/BattleroomDevTools/main-battleroom.ts |
β¬ TODO | Dev entry |
ποΈ Files to Delete After Migration
Once all migrations are complete:
src/lib/store/index.ts- Main Vuex storesrc/lib/store/actions.ts- Vuex actionssrc/lib/store/mutations.ts- Vuex mutationssrc/lib/store/getters.js- Vuex getterssrc/lib/store/bgmActionPatch.js- Audio patch
π Migration Pattern Examples
Example 1: Options API with mapGetters
Before (Vuex):
import { mapGetters } from "vuex";
export default defineComponent({
computed: {
...mapGetters(["getUserById"]),
},
methods: {
getUser() {
return this.getUserById(this.userId);
}
}
});
After (Pinia):
import { useUserStore } from '@/lib/store/stores/user';
export default defineComponent({
setup() {
const userStore = useUserStore();
return { userStore };
},
methods: {
getUser() {
return this.userStore.getUserById(this.userId);
}
}
});
Example 2: Composition API with useStore
Before (Vuex):
import { useStore } from 'vuex';
const store = useStore();
const users = computed(() => store.getters.usersAz);
await store.dispatch('loadUsers');
After (Pinia):
import { useUserStore } from '@/lib/store/stores/user';
const userStore = useUserStore();
const users = computed(() => userStore.usersAz);
await userStore.loadUsers();
Example 3: this.$store in Options API
Before (Vuex):
if (this.$store.state.devMode) { ... }
this.$store.commit('SET_DEV_MODE', true);
After (Pinia):
// In setup() or data()
const gameStore = useGameStore();
// In methods
if (this.gameStore.devMode) { ... }
this.gameStore.setDevMode(true);
π― Current Progress
- Total Files: 32
- Migrated: 10
- Remaining: 22
- Progress: 31%
β Completed Migrations (2025-12-21)
XpSupport.tsβuseGameStoreThemeSettings.vueβuseGameStoreFamilySettings.vueβuseUserStorePartySettings.vueβuseUserStoreRewardSettings.vueβuseUserStoreNotificationSettings.vueβuseUserStoreChoreSettings.tsβuseUserStoreXpApprovals.vueβuseUserStoreXpChat.tsβuseUserStore
π Notes
- Keep legacy Vuex store running in parallel until all migrations complete
- Test each component after migration
- Run
yarn buildto verify no TypeScript errors - The
musicBookmarkgetter in Vuex needs to be added touseAudioStoreif used