@hexah/skin-sdk 0.2.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -15
- package/index.js +26 -1
- package/package.json +1 -1
- package/runtime-stubs.js +89 -0
package/README.md
CHANGED
|
@@ -5,8 +5,7 @@ deweloperzy budują własne podstrony (ekrany szablonu) i motywy, **bez dostępu
|
|
|
5
5
|
|
|
6
6
|
Pakiet jest celowo „chudy": zawiera wyłącznie kontrakt (zero implementacji, zero importów
|
|
7
7
|
z aplikacji, brak Reacta i kroku budowania). Implementacje read-modeli, usług platformy i
|
|
8
|
-
prymitywów UI dostarcza **host** w runtime
|
|
9
|
-
repo: `frontend/common/skin-sdk/{runtime,ui,slots}.js`).
|
|
8
|
+
prymitywów UI dostarcza **aplikacja-host** w runtime przez Module Federation (shareScope).
|
|
10
9
|
|
|
11
10
|
## Instalacja
|
|
12
11
|
|
|
@@ -28,20 +27,46 @@ import { SCREEN_KEYS, SLOT_KEYS, DEFAULT_TEMPLATE, SKIN_API_VERSION } from '@hex
|
|
|
28
27
|
- `SKIN_API_VERSION` — wersja kontraktu, którą deklaruje skórka (host odrzuca niezgodny major).
|
|
29
28
|
- Typy JSDoc: `ReportListItem`, `ReportListView`, `ReportListResult`, `Pagination`, `SkinScreenProps`.
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
(`PageBox`, `HexahChip`, `DataList`…) i `useSlots()` paczka udostępnia jako **typowane atrapy**
|
|
33
|
-
(`runtime-stubs.js`) — dają podpowiedzi w edytorze, a realne implementacje dostarcza host w
|
|
34
|
-
runtime (Module Federation, shareScope). Atrapa wywołana poza hostem rzuca jasny błąd: skórka
|
|
35
|
-
działa wyłącznie wewnątrz aplikacji Hexah. Bundler skórki dzieli te paczki z `import: false`,
|
|
36
|
-
więc atrapy nigdy nie trafiają do bundla.
|
|
30
|
+
### Hooki danych (per strona gry)
|
|
37
31
|
|
|
38
|
-
|
|
32
|
+
| Strona | Hook |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| Aktualności / Kurier | `useArticles` |
|
|
35
|
+
| Harold (GPT) | `useGptThreads` |
|
|
36
|
+
| Operacje | `useTales` |
|
|
37
|
+
| Metropolia | `useTown` |
|
|
38
|
+
| Frakcje | `useGuild` |
|
|
39
|
+
| Kolonie | `useVillages` |
|
|
40
|
+
| Zgłoszenia | `useReports` |
|
|
41
|
+
| Konfiguracja | `useSettings` |
|
|
42
|
+
| Zaopatrzenie | `useShop` |
|
|
43
|
+
| Profil | `useAccountProfile` |
|
|
39
44
|
|
|
40
|
-
|
|
41
|
-
|
|
45
|
+
### Stan i usługi
|
|
46
|
+
|
|
47
|
+
Read-modele stanu: `useShard`, `useShardUser`, `useCharacter`, `useAccount`, `usePageData`,
|
|
48
|
+
`useOnlineCharacters`. Usługi: `useSnackbar`, `useDialog`, `useGamePageShell`. Sloty hosta:
|
|
49
|
+
`useSlots()` + `SLOT_KEYS`. Prymitywy UI: `PageBox`, `HexahChip`, `DataList`, `HexahPagination`,
|
|
50
|
+
`AngularPanel`, `StandardButton`, `RoundAvatar`, `HexahCharacterSection`.
|
|
51
|
+
|
|
52
|
+
Wszystko paczka udostępnia jako **typowane atrapy** — dają podpowiedzi w edytorze, a realne
|
|
53
|
+
implementacje dostarcza host w runtime (Module Federation, shareScope). Atrapa wywołana poza
|
|
54
|
+
hostem rzuca jasny błąd: skórka działa wyłącznie wewnątrz aplikacji Hexah. Bundler skórki dzieli
|
|
55
|
+
te paczki z `import: false`, więc atrapy nigdy nie trafiają do bundla.
|
|
56
|
+
|
|
57
|
+
## Tworzenie skórki
|
|
58
|
+
|
|
59
|
+
Najszybciej wystartujesz przez scaffolder:
|
|
42
60
|
|
|
43
|
-
|
|
61
|
+
```bash
|
|
62
|
+
npm create @hexah/skin moja-skorka # albo: npx @hexah/create-skin moja-skorka
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Wygenerowany projekt zawiera gotowy build (rspack + Module Federation), przykładowy ekran i
|
|
66
|
+
instrukcję podłączenia do środowiska testowego Hexah.
|
|
44
67
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
68
|
+
## Wersjonowanie
|
|
69
|
+
|
|
70
|
+
`SKIN_API_VERSION` (semver): **major** = zmiana łamiąca powierzchnię, **minor** = dodanie
|
|
71
|
+
zgodne wstecz, **patch** = bez zmiany powierzchni. Skórka deklaruje wersję w configu; host
|
|
72
|
+
odrzuca niezgodny major.
|
package/index.js
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* major. Bump: major = zmiana łamiąca powierzchnię, minor = dodanie zgodne wstecz,
|
|
20
20
|
* patch = bez zmiany powierzchni.
|
|
21
21
|
*/
|
|
22
|
-
const SKIN_API_VERSION = "0.
|
|
22
|
+
const SKIN_API_VERSION = "0.9.0";
|
|
23
23
|
|
|
24
24
|
/** Domyślny szablon, gdy motyw nie ma własnego wariantu wizualnego. */
|
|
25
25
|
const DEFAULT_TEMPLATE = "medieval";
|
|
@@ -98,6 +98,31 @@ const SLOT_KEYS = Object.freeze({
|
|
|
98
98
|
* @property {Pagination} pagination
|
|
99
99
|
*/
|
|
100
100
|
|
|
101
|
+
/**
|
|
102
|
+
* @typedef {object} ArticleListView — paginacja listy artykułów (Aktualności/Kurier).
|
|
103
|
+
* @property {number} [page]
|
|
104
|
+
* @property {number} [pageSize]
|
|
105
|
+
*/
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @typedef {object} Article — artykuł (read-model); pola dodatkowe z `getBySlug`.
|
|
109
|
+
* @property {number} id
|
|
110
|
+
* @property {string} title
|
|
111
|
+
* @property {string} slug
|
|
112
|
+
* @property {boolean} [pinned]
|
|
113
|
+
* @property {{ url?: string, name?: string }} [cover]
|
|
114
|
+
* @property {string} [createdAt]
|
|
115
|
+
* @property {number} [heartCount]
|
|
116
|
+
* @property {number} [uniqueViewCount]
|
|
117
|
+
* @property {boolean} [userHasHeart]
|
|
118
|
+
*/
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @typedef {object} ArticleListResult
|
|
122
|
+
* @property {Article[]} results
|
|
123
|
+
* @property {Pagination} pagination
|
|
124
|
+
*/
|
|
125
|
+
|
|
101
126
|
/**
|
|
102
127
|
* Kontrakt propsów ekranu skórki (komponent zarejestrowany pod `SCREEN_KEYS`).
|
|
103
128
|
* Sloty (gotowe komponenty hosta) przychodzą w `slots`.
|
package/package.json
CHANGED
package/runtime-stubs.js
CHANGED
|
@@ -58,6 +58,86 @@ const useDialog = hostProvided("useDialog");
|
|
|
58
58
|
const useReports = hostProvided("useReports");
|
|
59
59
|
/** @param {{ title?: string }} shell Ustawia tytuł/powłokę strony. @returns {void} */
|
|
60
60
|
const useGamePageShell = hostProvided("useGamePageShell");
|
|
61
|
+
/**
|
|
62
|
+
* API artykułów (Aktualności/Kurier).
|
|
63
|
+
* @returns {{
|
|
64
|
+
* list: (data: import('./index').ArticleListView & { callback: (r:any)=>void }) => void,
|
|
65
|
+
* getBySlug: (data: { slug: string, callback: (r:any)=>void }) => void,
|
|
66
|
+
* recordView: (data: { slug: string, callback?: (r:any)=>void }) => void,
|
|
67
|
+
* markKurierRead: (data: { slug: string, callback?: (r:any)=>void }) => void,
|
|
68
|
+
* listComments: (data: { slug: string, page?: number, pageSize?: number, callback: (r:any)=>void }) => void,
|
|
69
|
+
* createComment: (data: { slug: string, body: string, callback: (r:any)=>void }) => void,
|
|
70
|
+
* toggleReaction: (data: { slug: string, callback: (r:any)=>void }) => void,
|
|
71
|
+
* }}
|
|
72
|
+
*/
|
|
73
|
+
const useArticles = hostProvided("useArticles");
|
|
74
|
+
/**
|
|
75
|
+
* API wątków GPT (Harold).
|
|
76
|
+
* @returns {{
|
|
77
|
+
* list: (data: { page?: number, pageSize?: number, callback: (r:any)=>void }) => void,
|
|
78
|
+
* get: (data: { threadId: number, callback: (r:any)=>void }) => void,
|
|
79
|
+
* create: (data: { message: string, callback: (r:any)=>void }) => void,
|
|
80
|
+
* remove: (data: { threadId: number, callback: (r:any)=>void }) => void,
|
|
81
|
+
* sendMessage: (data: { threadId: number, message: string, callback: (r:any)=>void }) => void,
|
|
82
|
+
* }}
|
|
83
|
+
*/
|
|
84
|
+
const useGptThreads = hostProvided("useGptThreads");
|
|
85
|
+
/**
|
|
86
|
+
* API opowieści/operacji (lista, wyszukiwanie, podgląd, ulubione/preferencje, dołącz/opuść,
|
|
87
|
+
* subskrypcja). Rozgrywka w pokoju sesji jest po stronie hosta (poza tą powierzchnią).
|
|
88
|
+
* @returns {{
|
|
89
|
+
* list: (data: { type?: string, filter?: string, page?: number, pageSize?: number, callback: (r:any)=>void }) => void,
|
|
90
|
+
* search: (data: { callback: (r:any)=>void }) => void,
|
|
91
|
+
* get: (data: { callback: (r:any)=>void }) => void,
|
|
92
|
+
* getFavorites: (data: { callback: (r:any)=>void }) => void,
|
|
93
|
+
* getPreferences: (data: { callback: (r:any)=>void }) => void,
|
|
94
|
+
* togglePreference: (data: { callback: (r:any)=>void }) => void,
|
|
95
|
+
* join: (data: { callback: (r:any)=>void }) => void,
|
|
96
|
+
* leave: (data: { callback: (r:any)=>void }) => void,
|
|
97
|
+
* toggleSubscribe: (data: { callback: (r:any)=>void }) => void,
|
|
98
|
+
* checkSubscribe: (data: { callback: (r:any)=>void }) => void,
|
|
99
|
+
* }}
|
|
100
|
+
*/
|
|
101
|
+
const useTales = hostProvided("useTales");
|
|
102
|
+
/**
|
|
103
|
+
* API budynków Metropolii (bank, mesa, zielarz, Voltar, ratusz, warsztat, kuźnia, praca).
|
|
104
|
+
* Metody: bankSend, innRest, innBuyTravelerKit, healerPlantsList, healerHeal, voltarToolsList,
|
|
105
|
+
* voltarBuy, hallTypes, hallPriceList, hallBuy, workshopPlansList, workshopPlanGet,
|
|
106
|
+
* workshopCraftItem, forgePlansList, forgePlanGet, forgeCraftMaterial, workPerform.
|
|
107
|
+
* @returns {Record<string, (data: { callback: (r:any)=>void }) => void>}
|
|
108
|
+
*/
|
|
109
|
+
const useTown = hostProvided("useTown");
|
|
110
|
+
/**
|
|
111
|
+
* API Frakcji (gildii): create, join, list, search, get, sendCrabs, headquartersRestInfo,
|
|
112
|
+
* headquartersRest, leave, getPermissions, specialActions, getProperties, hexmap (populacje/
|
|
113
|
+
* aktywność), provinceInfo, publicStats, warehouse (get/deposit/withdraw), materials
|
|
114
|
+
* (get/donate/distribute).
|
|
115
|
+
* @returns {Record<string, (data: { callback: (r:any)=>void }) => void>}
|
|
116
|
+
*/
|
|
117
|
+
const useGuild = hostProvided("useGuild");
|
|
118
|
+
/**
|
|
119
|
+
* API Kolonii (osad): found, takeAbandoned, get, list, build (create/cost/upgrade/demolish/
|
|
120
|
+
* move/resetAll), depositCrabs, withdrawCrabs, sendResourcesToGuild, abandon, rebellionResolve,
|
|
121
|
+
* taxesSet, governorAssign, techniqueList, techniqueUpgrade, hexDecorationsUpdate, nameUpdate.
|
|
122
|
+
* @returns {Record<string, (data: { callback: (r:any)=>void }) => void>}
|
|
123
|
+
*/
|
|
124
|
+
const useVillages = hostProvided("useVillages");
|
|
125
|
+
/**
|
|
126
|
+
* API Konfiguracji: updateSetting, setInvisibleOnline, updateNewsletterSubscription.
|
|
127
|
+
* @returns {Record<string, (data: { callback: (r:any)=>void }) => void>}
|
|
128
|
+
*/
|
|
129
|
+
const useSettings = hostProvided("useSettings");
|
|
130
|
+
/**
|
|
131
|
+
* API sklepu (Zaopatrzenie): getOffers, getItems, buyItem, startPayment.
|
|
132
|
+
* @returns {Record<string, (data: { callback: (r:any)=>void }) => void>}
|
|
133
|
+
*/
|
|
134
|
+
const useShop = hostProvided("useShop");
|
|
135
|
+
/**
|
|
136
|
+
* API Profilu/konta: getAccountInfo, getBlockedList, blockUser, unblockUser, linkDiscord,
|
|
137
|
+
* getGlobalStats.
|
|
138
|
+
* @returns {Record<string, (data: { callback: (r:any)=>void }) => void>}
|
|
139
|
+
*/
|
|
140
|
+
const useAccountProfile = hostProvided("useAccountProfile");
|
|
61
141
|
|
|
62
142
|
/* ---------- Sloty (host) ---------- */
|
|
63
143
|
/** Provider slotów hosta (host montuje go sam; skórka go nie używa). */
|
|
@@ -118,6 +198,15 @@ module.exports = {
|
|
|
118
198
|
useDialog,
|
|
119
199
|
useReports,
|
|
120
200
|
useGamePageShell,
|
|
201
|
+
useArticles,
|
|
202
|
+
useGptThreads,
|
|
203
|
+
useTales,
|
|
204
|
+
useTown,
|
|
205
|
+
useGuild,
|
|
206
|
+
useVillages,
|
|
207
|
+
useSettings,
|
|
208
|
+
useShop,
|
|
209
|
+
useAccountProfile,
|
|
121
210
|
SlotsProvider,
|
|
122
211
|
useSlots,
|
|
123
212
|
PageBox,
|