ps99-api 1.1.0 → 2.0.0

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.
Files changed (244) hide show
  1. package/.github/actions/test/action.yml +3 -3
  2. package/.github/workflows/release-on-main.yml +0 -1
  3. package/.github/workflows/test-on-branch.yml +1 -1
  4. package/.idea/runConfigurations/test.xml +11 -0
  5. package/.idea/runConfigurations/test_changing.xml +11 -0
  6. package/.idea/runConfigurations/test_snapshot.xml +11 -0
  7. package/.idea/runConfigurations/test_snapshot_changing.xml +12 -0
  8. package/.idea/webResources.xml +14 -0
  9. package/.releaserc +13 -0
  10. package/README.md +5 -6
  11. package/dist/index.d.ts +33 -1
  12. package/dist/index.js +33 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/ps99-api.d.ts +18 -8
  15. package/dist/ps99-api.js +7 -4
  16. package/dist/ps99-api.js.map +1 -1
  17. package/dist/responses/clan.d.ts +1 -0
  18. package/dist/responses/collection/achievement.d.ts +32 -0
  19. package/dist/responses/{collections.js → collection/achievement.js} +1 -1
  20. package/dist/responses/collection/achievement.js.map +1 -0
  21. package/dist/responses/collection/boost.d.ts +7 -0
  22. package/dist/responses/{collection.js → collection/boost.js} +1 -1
  23. package/dist/responses/collection/boost.js.map +1 -0
  24. package/dist/responses/collection/booth.d.ts +29 -0
  25. package/dist/responses/collection/booth.js +3 -0
  26. package/dist/responses/collection/booth.js.map +1 -0
  27. package/dist/responses/collection/box.d.ts +26 -0
  28. package/dist/responses/collection/box.js +3 -0
  29. package/dist/responses/collection/box.js.map +1 -0
  30. package/dist/responses/collection/buff.d.ts +9 -0
  31. package/dist/responses/collection/buff.js +3 -0
  32. package/dist/responses/collection/buff.js.map +1 -0
  33. package/dist/responses/collection/charm.d.ts +28 -0
  34. package/dist/responses/collection/charm.js +3 -0
  35. package/dist/responses/collection/charm.js.map +1 -0
  36. package/dist/responses/collection/collection-data.d.ts +9 -0
  37. package/dist/responses/collection/collection-data.js +3 -0
  38. package/dist/responses/collection/collection-data.js.map +1 -0
  39. package/dist/responses/collection/currency.d.ts +44 -0
  40. package/dist/responses/collection/currency.js +3 -0
  41. package/dist/responses/collection/currency.js.map +1 -0
  42. package/dist/responses/collection/egg.d.ts +43 -0
  43. package/dist/responses/collection/egg.js +3 -0
  44. package/dist/responses/collection/egg.js.map +1 -0
  45. package/dist/responses/collection/enchantment.d.ts +31 -0
  46. package/dist/responses/collection/enchantment.js +3 -0
  47. package/dist/responses/collection/enchantment.js.map +1 -0
  48. package/dist/responses/collection/fishing-rod.d.ts +16 -0
  49. package/dist/responses/collection/fishing-rod.js +3 -0
  50. package/dist/responses/collection/fishing-rod.js.map +1 -0
  51. package/dist/responses/collection/fruit.d.ts +27 -0
  52. package/dist/responses/collection/fruit.js +3 -0
  53. package/dist/responses/collection/fruit.js.map +1 -0
  54. package/dist/responses/collection/guild-battle.d.ts +34 -0
  55. package/dist/responses/collection/guild-battle.js +3 -0
  56. package/dist/responses/collection/guild-battle.js.map +1 -0
  57. package/dist/responses/collection/hoverboard.d.ts +40 -0
  58. package/dist/responses/collection/hoverboard.js +3 -0
  59. package/dist/responses/collection/hoverboard.js.map +1 -0
  60. package/dist/responses/collection/index.d.ts +39 -0
  61. package/dist/responses/collection/index.js +3 -0
  62. package/dist/responses/collection/index.js.map +1 -0
  63. package/dist/responses/collection/lootbox.d.ts +20 -0
  64. package/dist/responses/collection/lootbox.js +3 -0
  65. package/dist/responses/collection/lootbox.js.map +1 -0
  66. package/dist/responses/collection/mastery.d.ts +113 -0
  67. package/dist/responses/collection/mastery.js +3 -0
  68. package/dist/responses/collection/mastery.js.map +1 -0
  69. package/dist/responses/collection/merchant.d.ts +14 -0
  70. package/dist/responses/collection/merchant.js +3 -0
  71. package/dist/responses/collection/merchant.js.map +1 -0
  72. package/dist/responses/collection/misc-item.d.ts +23 -0
  73. package/dist/responses/collection/misc-item.js +3 -0
  74. package/dist/responses/collection/misc-item.js.map +1 -0
  75. package/dist/responses/collection/pet.d.ts +105 -0
  76. package/dist/responses/collection/pet.js +3 -0
  77. package/dist/responses/collection/pet.js.map +1 -0
  78. package/dist/responses/collection/potion.d.ts +29 -0
  79. package/dist/responses/collection/potion.js +3 -0
  80. package/dist/responses/collection/potion.js.map +1 -0
  81. package/dist/responses/collection/random-event.d.ts +21 -0
  82. package/dist/responses/collection/random-event.js +3 -0
  83. package/dist/responses/collection/random-event.js.map +1 -0
  84. package/dist/responses/collection/rank.d.ts +36 -0
  85. package/dist/responses/collection/rank.js +3 -0
  86. package/dist/responses/collection/rank.js.map +1 -0
  87. package/dist/responses/collection/rarity.d.ts +12 -0
  88. package/dist/responses/collection/rarity.js +3 -0
  89. package/dist/responses/collection/rarity.js.map +1 -0
  90. package/dist/responses/collection/rebirth.d.ts +19 -0
  91. package/dist/responses/collection/rebirth.js +3 -0
  92. package/dist/responses/collection/rebirth.js.map +1 -0
  93. package/dist/responses/collection/secret-room.d.ts +9 -0
  94. package/dist/responses/collection/secret-room.js +3 -0
  95. package/dist/responses/collection/secret-room.js.map +1 -0
  96. package/dist/responses/collection/seed.d.ts +47 -0
  97. package/dist/responses/collection/seed.js +3 -0
  98. package/dist/responses/collection/seed.js.map +1 -0
  99. package/dist/responses/collection/shovel.d.ts +10 -0
  100. package/dist/responses/collection/shovel.js +3 -0
  101. package/dist/responses/collection/shovel.js.map +1 -0
  102. package/dist/responses/collection/sprinkler.d.ts +23 -0
  103. package/dist/responses/collection/sprinkler.js +3 -0
  104. package/dist/responses/collection/sprinkler.js.map +1 -0
  105. package/dist/responses/collection/ultimate.d.ts +28 -0
  106. package/dist/responses/collection/ultimate.js +3 -0
  107. package/dist/responses/collection/ultimate.js.map +1 -0
  108. package/dist/responses/collection/upgrade.d.ts +51 -0
  109. package/dist/responses/collection/upgrade.js +3 -0
  110. package/dist/responses/collection/upgrade.js.map +1 -0
  111. package/dist/responses/collection/watering-can.d.ts +10 -0
  112. package/dist/responses/collection/watering-can.js +3 -0
  113. package/dist/responses/collection/watering-can.js.map +1 -0
  114. package/dist/responses/collection/world.d.ts +12 -0
  115. package/dist/responses/collection/world.js +3 -0
  116. package/dist/responses/collection/world.js.map +1 -0
  117. package/dist/responses/collection/zone-flag.d.ts +23 -0
  118. package/dist/responses/collection/zone-flag.js +3 -0
  119. package/dist/responses/collection/zone-flag.js.map +1 -0
  120. package/dist/responses/collection/zone.d.ts +104 -0
  121. package/dist/responses/collection/zone.js +3 -0
  122. package/dist/responses/collection/zone.js.map +1 -0
  123. package/dump-result.js +16 -4
  124. package/example-web/react/package-lock.json +4900 -0
  125. package/example-web/react/package.json +28 -0
  126. package/example-web/react/public/index.html +12 -0
  127. package/example-web/react/src/App.css +95 -0
  128. package/example-web/react/src/App.tsx +32 -0
  129. package/example-web/react/src/ClanDetails.css +39 -0
  130. package/example-web/react/src/ClanDetails.tsx +119 -0
  131. package/example-web/react/src/Image.tsx +46 -0
  132. package/example-web/react/src/index.tsx +5 -0
  133. package/example-web/react/tsconfig.json +16 -0
  134. package/example-web/react/webpack.config.js +36 -0
  135. package/example-web/react2/package-lock.json +5248 -0
  136. package/example-web/react2/package.json +30 -0
  137. package/example-web/react2/public/_redirects +1 -0
  138. package/example-web/react2/public/icons/icon-192x192.png +0 -0
  139. package/example-web/react2/public/icons/icon-512x512.png +0 -0
  140. package/example-web/react2/public/index.html +31 -0
  141. package/example-web/react2/public/manifest.json +20 -0
  142. package/example-web/react2/public/service-worker.js +63 -0
  143. package/example-web/react2/src/App.tsx +33 -0
  144. package/example-web/react2/src/components/AchievementsComponent.tsx +41 -0
  145. package/example-web/react2/src/components/BoostsComponent.tsx +24 -0
  146. package/example-web/react2/src/components/BoothsComponent.tsx +32 -0
  147. package/example-web/react2/src/components/BoxesComponent.tsx +35 -0
  148. package/example-web/react2/src/components/BuffsComponent.tsx +25 -0
  149. package/example-web/react2/src/components/CharmsComponent.tsx +41 -0
  150. package/example-web/react2/src/components/CollectionConfigIndex.tsx +53 -0
  151. package/example-web/react2/src/components/CollectionsIndex.tsx +33 -0
  152. package/example-web/react2/src/components/CurrencyComponent.tsx +65 -0
  153. package/example-web/react2/src/components/DynamicCollectionConfigData.tsx +94 -0
  154. package/example-web/react2/src/components/EggsComponent.tsx +62 -0
  155. package/example-web/react2/src/components/EnchantsComponent.tsx +46 -0
  156. package/example-web/react2/src/components/ErrorComponent.tsx +16 -0
  157. package/example-web/react2/src/components/FishingRodsComponent.tsx +42 -0
  158. package/example-web/react2/src/components/FruitsComponent.tsx +36 -0
  159. package/example-web/react2/src/components/GenericFetchComponent.tsx +53 -0
  160. package/example-web/react2/src/components/GuildBattlesComponent.tsx +76 -0
  161. package/example-web/react2/src/components/Header.tsx +27 -0
  162. package/example-web/react2/src/components/HomePage.tsx +14 -0
  163. package/example-web/react2/src/components/HoverboardsComponent.tsx +47 -0
  164. package/example-web/react2/src/components/ImageComponent.tsx +64 -0
  165. package/example-web/react2/src/components/LootboxesComponent.tsx +26 -0
  166. package/example-web/react2/src/components/MasteryComponent.tsx +56 -0
  167. package/example-web/react2/src/components/MerchantsComponent.tsx +45 -0
  168. package/example-web/react2/src/components/MiscItemsComponent.tsx +37 -0
  169. package/example-web/react2/src/components/PetsComponent.tsx +62 -0
  170. package/example-web/react2/src/components/PotionsComponent.tsx +49 -0
  171. package/example-web/react2/src/components/RandomEventsComponent.tsx +46 -0
  172. package/example-web/react2/src/components/RanksComponent.tsx +87 -0
  173. package/example-web/react2/src/components/RarityComponent.tsx +24 -0
  174. package/example-web/react2/src/components/RebirthsComponent.tsx +37 -0
  175. package/example-web/react2/src/components/SecretRoomsComponent.tsx +23 -0
  176. package/example-web/react2/src/components/SeedsComponent.tsx +74 -0
  177. package/example-web/react2/src/components/ShovelsComponent.tsx +28 -0
  178. package/example-web/react2/src/components/SprinklersComponent.tsx +29 -0
  179. package/example-web/react2/src/components/UltimatesComponent.tsx +35 -0
  180. package/example-web/react2/src/components/UpgradesComponent.tsx +74 -0
  181. package/example-web/react2/src/components/WateringCansComponent.tsx +31 -0
  182. package/example-web/react2/src/components/WorldsComponent.tsx +36 -0
  183. package/example-web/react2/src/components/ZoneFlagsComponent.tsx +33 -0
  184. package/example-web/react2/src/components/ZonesComponent.tsx +89 -0
  185. package/example-web/react2/src/index.tsx +7 -0
  186. package/example-web/react2/tsconfig.json +16 -0
  187. package/example-web/react2/webpack.config.js +38 -0
  188. package/jest.config.js +2 -2
  189. package/package.json +16 -9
  190. package/src/__tests__/__snapshots__/ps99-api-changes.ts.snap +92438 -0
  191. package/src/__tests__/__snapshots__/ps99-api-live.ts.snap +1313 -86
  192. package/src/__tests__/ps99-api-changes.ts +9 -11
  193. package/src/__tests__/ps99-api-live.ts +35 -36
  194. package/src/__tests__/ps99-api.ts +2 -2
  195. package/src/index.ts +33 -1
  196. package/src/ps99-api.ts +21 -12
  197. package/src/responses/activeClanBattle.ts +30 -30
  198. package/src/responses/clan.ts +70 -70
  199. package/src/responses/clans.ts +9 -9
  200. package/src/responses/collection/achievement.ts +42 -0
  201. package/src/responses/collection/boost.ts +14 -0
  202. package/src/responses/collection/booth.ts +31 -0
  203. package/src/responses/collection/box.ts +28 -0
  204. package/src/responses/collection/buff.ts +11 -0
  205. package/src/responses/collection/charm.ts +32 -0
  206. package/src/responses/collection/collection-data.ts +14 -0
  207. package/src/responses/collection/currency.ts +54 -0
  208. package/src/responses/collection/egg.ts +47 -0
  209. package/src/responses/collection/enchantment.ts +35 -0
  210. package/src/responses/collection/fishing-rod.ts +21 -0
  211. package/src/responses/collection/fruit.ts +31 -0
  212. package/src/responses/collection/guild-battle.ts +45 -0
  213. package/src/responses/collection/hoverboard.ts +46 -0
  214. package/src/responses/collection/index.ts +78 -0
  215. package/src/responses/collection/lootbox.ts +23 -0
  216. package/src/responses/collection/mastery.ts +119 -0
  217. package/src/responses/collection/merchant.ts +16 -0
  218. package/src/responses/collection/misc-item.ts +26 -0
  219. package/src/responses/collection/pet.ts +115 -0
  220. package/src/responses/collection/potion.ts +33 -0
  221. package/src/responses/collection/random-event.ts +27 -0
  222. package/src/responses/collection/rank.ts +42 -0
  223. package/src/responses/collection/rarity.ts +14 -0
  224. package/src/responses/collection/rebirth.ts +22 -0
  225. package/src/responses/collection/secret-room.ts +14 -0
  226. package/src/responses/collection/seed.ts +55 -0
  227. package/src/responses/collection/shovel.ts +12 -0
  228. package/src/responses/collection/sprinkler.ts +26 -0
  229. package/src/responses/collection/ultimate.ts +31 -0
  230. package/src/responses/collection/upgrade.ts +58 -0
  231. package/src/responses/collection/watering-can.ts +15 -0
  232. package/src/responses/collection/world.ts +14 -0
  233. package/src/responses/collection/zone-flag.ts +26 -0
  234. package/src/responses/collection/zone.ts +115 -0
  235. package/src/responses/exists.ts +8 -8
  236. package/src/responses/rap.ts +9 -9
  237. package/tsconfig.json +2 -2
  238. package/.release.rc +0 -8
  239. package/dist/responses/collection.d.ts +0 -1357
  240. package/dist/responses/collection.js.map +0 -1
  241. package/dist/responses/collections.d.ts +0 -5
  242. package/dist/responses/collections.js.map +0 -1
  243. package/src/responses/collection.ts +0 -1543
  244. package/src/responses/collections.ts +0 -3
@@ -0,0 +1,62 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+ import ImageComponent from "./ImageComponent";
5
+
6
+ const EggsComponent: React.FC<{
7
+ configData?: CollectionConfigData<"Eggs">;
8
+ }> = ({ configData }) => {
9
+ return (
10
+ <GenericFetchComponent<CollectionConfigData<"Eggs">>
11
+ collectionName="Eggs"
12
+ configData={configData}
13
+ render={(data) => (
14
+ <div>
15
+ <h2>{data.name}</h2>
16
+ <ImageComponent src={data.icon} alt={data.name} />
17
+ <p>Currency: {data.currency}</p>
18
+ <p>Override Cost: {data.overrideCost}</p>
19
+ {data.isCustomEgg && <p>Custom Egg: Yes</p>}
20
+ {data.bestEgg && <p>Best Egg: Yes</p>}
21
+ {data.disableGold && <p>Disable Gold: Yes</p>}
22
+ {data.disableRainbow && <p>Disable Rainbow: Yes</p>}
23
+ {data.disableShiny && <p>Disable Shiny: Yes</p>}
24
+ {data.disableModifiers && <p>Disable Modifiers: Yes</p>}
25
+ {data.goldChance && <p>Gold Chance: {data.goldChance}</p>}
26
+ {data.rainbowChance && <p>Rainbow Chance: {data.rainbowChance}</p>}
27
+ {data.shinyChance && <p>Shiny Chance: {data.shinyChance}</p>}
28
+ {data.rarity && (
29
+ <div>
30
+ <p>Rarity: {data.rarity.DisplayName}</p>
31
+ <p>Rarity Number: {data.rarity.RarityNumber}</p>
32
+ </div>
33
+ )}
34
+ <h3>Pets:</h3>
35
+ <ul>
36
+ {data.pets.map((pet, index) => (
37
+ <li key={index}>
38
+ <p>Name: {pet[0]}</p>
39
+ <p>Chance: {pet[1]}</p>
40
+ {pet[2] && <p>Tier: {pet[2]}</p>}
41
+ </li>
42
+ ))}
43
+ </ul>
44
+ {data.productIds && (
45
+ <div>
46
+ <h3>Product IDs:</h3>
47
+ <ul>
48
+ {Object.entries(data.productIds).map(([key, value]) => (
49
+ <li key={key}>
50
+ {key}: {value}
51
+ </li>
52
+ ))}
53
+ </ul>
54
+ </div>
55
+ )}
56
+ </div>
57
+ )}
58
+ />
59
+ );
60
+ };
61
+
62
+ export default EggsComponent;
@@ -0,0 +1,46 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+ import ImageComponent from "./ImageComponent";
5
+
6
+ const EnchantsComponent: React.FC<{
7
+ configData?: CollectionConfigData<"Enchants">;
8
+ }> = ({ configData }) => {
9
+ return (
10
+ <GenericFetchComponent<CollectionConfigData<"Enchants">>
11
+ collectionName="Enchants"
12
+ configData={configData}
13
+ render={(data) => (
14
+ <div>
15
+ <h2>Enchantment</h2>
16
+ {data.PageIcon && (
17
+ <ImageComponent src={data.PageIcon} alt="Page Icon" />
18
+ )}
19
+ <p>Base Tier: {data.BaseTier}</p>
20
+ <p>Max Tier: {data.MaxTier}</p>
21
+ <p>Max Page: {data.MaxPage}</p>
22
+ {data.DiminishPowerThreshold && (
23
+ <p>Diminish Power Threshold: {data.DiminishPowerThreshold}</p>
24
+ )}
25
+ {data.EmpoweredBoost && <p>Empowered Boost: {data.EmpoweredBoost}</p>}
26
+ {data.ProductId && <p>Product ID: {data.ProductId}</p>}
27
+ <h3>Tiers:</h3>
28
+ <ul>
29
+ {data.Tiers.map((tier, index) => (
30
+ <li key={index}>
31
+ <ImageComponent src={tier.Icon} alt={tier.DisplayName} />
32
+ <p>Display Name: {tier.DisplayName}</p>
33
+ <p>Description: {tier.Desc}</p>
34
+ <p>Power: {tier.Power}</p>
35
+ <p>Rarity: {tier.Rarity.DisplayName}</p>
36
+ <p>Rarity Number: {tier.Rarity.RarityNumber}</p>
37
+ </li>
38
+ ))}
39
+ </ul>
40
+ </div>
41
+ )}
42
+ />
43
+ );
44
+ };
45
+
46
+ export default EnchantsComponent;
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+
3
+ interface ErrorProps {
4
+ message: string;
5
+ }
6
+
7
+ const ErrorComponent: React.FC<ErrorProps> = ({ message }) => {
8
+ return (
9
+ <div>
10
+ <h2>Error</h2>
11
+ <p>{message}</p>
12
+ </div>
13
+ );
14
+ };
15
+
16
+ export default ErrorComponent;
@@ -0,0 +1,42 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+ import ImageComponent from "./ImageComponent";
5
+
6
+ const FishingRodsComponent: React.FC<{
7
+ configData?: CollectionConfigData<"FishingRods">;
8
+ }> = ({ configData }) => {
9
+ return (
10
+ <GenericFetchComponent<CollectionConfigData<"FishingRods">>
11
+ collectionName="FishingRods"
12
+ configData={configData}
13
+ render={(data) => (
14
+ <div>
15
+ <h2>{data.DisplayName}</h2>
16
+ <ImageComponent src={data.Icon} alt={data.DisplayName} />
17
+ <p>Fishing Chance: {data.FishingChance}</p>
18
+ <p>Fishing Currency Multiplier: {data.FishingCurrencyMultiplier}</p>
19
+ <p>Minimum Fishing Time: {data.MinFishingTime} seconds</p>
20
+ <p>
21
+ Fishing Game Speed Multiplier: {data.FishingGameSpeedMultiplier}
22
+ </p>
23
+ <p>Bar Size: {data.BarSize}</p>
24
+ <p>Associated Item ID: {data.AssociatedItemID}</p>
25
+ {data.MerchantSalePrice && (
26
+ <p>Merchant Sale Price: {data.MerchantSalePrice}</p>
27
+ )}
28
+ <h3>Fishing Odds:</h3>
29
+ <ul>
30
+ {data.FishingOdds.map((odds, index) => (
31
+ <li key={index}>
32
+ {odds[0]}: {odds[1]}%
33
+ </li>
34
+ ))}
35
+ </ul>
36
+ </div>
37
+ )}
38
+ />
39
+ );
40
+ };
41
+
42
+ export default FishingRodsComponent;
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+ import ImageComponent from "./ImageComponent";
5
+
6
+ const FruitsComponent: React.FC<{
7
+ configData?: CollectionConfigData<"Fruits">;
8
+ }> = ({ configData }) => {
9
+ return (
10
+ <GenericFetchComponent<CollectionConfigData<"Fruits">>
11
+ collectionName="Fruits"
12
+ configData={configData}
13
+ render={(data) => (
14
+ <div>
15
+ <h2>{data.DisplayName}</h2>
16
+ <ImageComponent src={data.Icon} alt={data.DisplayName} />
17
+ <p>Duration: {data.Duration} seconds</p>
18
+ <p>Rarity: {data.Rarity.DisplayName}</p>
19
+ <p>Rarity Number: {data.Rarity.RarityNumber}</p>
20
+ {data.Desc && <p>Description: {data.Desc}</p>}
21
+ {data.IgnoreFruitMachine && <p>Ignore Fruit Machine: Yes</p>}
22
+ <h3>Boosts:</h3>
23
+ <ul>
24
+ {data.Boost.map((boost, index) => (
25
+ <li key={index}>
26
+ {boost.Type}: {boost.Amount}
27
+ </li>
28
+ ))}
29
+ </ul>
30
+ </div>
31
+ )}
32
+ />
33
+ );
34
+ };
35
+
36
+ export default FruitsComponent;
@@ -0,0 +1,53 @@
1
+ import React, { useEffect, useState, ReactNode } from "react";
2
+ import { useParams } from "react-router-dom";
3
+ import { PetSimulator99API, ApiResponseBody, CollectionName } from "ps99-api";
4
+
5
+ interface GenericFetchComponentProps<T> {
6
+ collectionName: CollectionName;
7
+ render: (data: T) => ReactNode;
8
+ configData?: T;
9
+ }
10
+
11
+ export const GenericFetchComponent = <T,>({
12
+ collectionName,
13
+ render,
14
+ configData,
15
+ }: GenericFetchComponentProps<T>) => {
16
+ const { configName } = useParams<{ configName: string }>();
17
+ const [data, setData] = useState<T | null>(configData || null);
18
+ const [error, setError] = useState<string | null>(null);
19
+
20
+ useEffect(() => {
21
+ if (configData) return;
22
+
23
+ const fetchData = async () => {
24
+ if (!configName) return;
25
+ const api = new PetSimulator99API();
26
+ const response: ApiResponseBody<any[]> =
27
+ await api.getCollection(collectionName);
28
+ if (response.status === "ok") {
29
+ const item = response.data.find(
30
+ (item) => item.configName === configName,
31
+ );
32
+ if (item) {
33
+ setData(item.configData);
34
+ } else {
35
+ setError("Configuration not found");
36
+ }
37
+ } else {
38
+ setError(response.error.message);
39
+ }
40
+ };
41
+ fetchData();
42
+ }, [collectionName, configName, configData]);
43
+
44
+ if (error) {
45
+ return <div>Error: {error}</div>;
46
+ }
47
+
48
+ if (!data) {
49
+ return <div>Loading...</div>;
50
+ }
51
+
52
+ return <>{render(data)}</>;
53
+ };
@@ -0,0 +1,76 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+
5
+ const GuildBattlesComponent: React.FC<{
6
+ configData?: CollectionConfigData<"GuildBattles">;
7
+ }> = ({ configData }) => {
8
+ return (
9
+ <GenericFetchComponent<CollectionConfigData<"GuildBattles">>
10
+ collectionName="GuildBattles"
11
+ configData={configData}
12
+ render={(data) => (
13
+ <div>
14
+ <h2>{data.Title}</h2>
15
+ <p>Start Time: {new Date(data.StartTime * 1000).toLocaleString()}</p>
16
+ <p>
17
+ Finish Time: {new Date(data.FinishTime * 1000).toLocaleString()}
18
+ </p>
19
+ {data.HasGoals && <p>Has Goals: Yes</p>}
20
+ <h3>Placement Rewards:</h3>
21
+ <ul>
22
+ {data.PlacementRewards?.map((reward, index) => (
23
+ <li key={index}>
24
+ <p>Item ID: {reward.Item._data.id}</p>
25
+ {reward.Item._data.pt && <p>Points: {reward.Item._data.pt}</p>}
26
+ <p>Best: {reward.Best}</p>
27
+ <p>Worst: {reward.Worst}</p>
28
+ </li>
29
+ ))}
30
+ </ul>
31
+ <h3>Rewards:</h3>
32
+ <div>
33
+ <h4>Gold:</h4>
34
+ <ul>
35
+ {data.Rewards.Gold.map((reward, index) => (
36
+ <li key={index}>
37
+ <p>Item ID: {reward._data.id}</p>
38
+ </li>
39
+ ))}
40
+ </ul>
41
+ <h4>Silver:</h4>
42
+ <ul>
43
+ {data.Rewards.Silver.map((reward, index) => (
44
+ <li key={index}>
45
+ <p>Item ID: {reward._data.id}</p>
46
+ </li>
47
+ ))}
48
+ </ul>
49
+ <h4>Bronze:</h4>
50
+ <ul>
51
+ {data.Rewards.Bronze.map((reward, index) => (
52
+ <li key={index}>
53
+ <p>Item ID: {reward._data.id}</p>
54
+ </li>
55
+ ))}
56
+ </ul>
57
+ {data.Rewards.Good && (
58
+ <div>
59
+ <h4>Good:</h4>
60
+ <ul>
61
+ {data.Rewards.Good.map((reward, index) => (
62
+ <li key={index}>
63
+ <p>Item ID: {reward._data.id}</p>
64
+ </li>
65
+ ))}
66
+ </ul>
67
+ </div>
68
+ )}
69
+ </div>
70
+ </div>
71
+ )}
72
+ />
73
+ );
74
+ };
75
+
76
+ export default GuildBattlesComponent;
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+ import { useLocation, Link } from "react-router-dom";
3
+
4
+ const Header: React.FC = () => {
5
+ const location = useLocation();
6
+ const pathnames = location.pathname.split("/").filter((x) => x);
7
+
8
+ return (
9
+ <nav>
10
+ <ol>
11
+ <li>
12
+ <Link to="/">Home</Link>
13
+ </li>
14
+ {pathnames.map((value, index) => {
15
+ const to = `/${pathnames.slice(0, index + 1).join("/")}`;
16
+ return (
17
+ <li key={to}>
18
+ <Link to={to}>{decodeURIComponent(value)}</Link>
19
+ </li>
20
+ );
21
+ })}
22
+ </ol>
23
+ </nav>
24
+ );
25
+ };
26
+
27
+ export default Header;
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { Link } from "react-router-dom";
3
+
4
+ const HomePage: React.FC = () => {
5
+ return (
6
+ <div>
7
+ <h1>Welcome to Pet Simulator 99 API</h1>
8
+ <p>Select a collection to get started:</p>
9
+ <Link to="/collections">View Collections</Link>
10
+ </div>
11
+ );
12
+ };
13
+
14
+ export default HomePage;
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+ import ImageComponent from "./ImageComponent";
5
+
6
+ const HoverboardsComponent: React.FC<{
7
+ configData?: CollectionConfigData<"Hoverboards">;
8
+ }> = ({ configData }) => {
9
+ return (
10
+ <GenericFetchComponent<CollectionConfigData<"Hoverboards">>
11
+ collectionName="Hoverboards"
12
+ configData={configData}
13
+ render={(data) => (
14
+ <div>
15
+ <h2>{data.DisplayName}</h2>
16
+ <ImageComponent src={data.Icon} alt={data.DisplayName} />
17
+ <p>Description: {data.Desc}</p>
18
+ <p>Rarity: {data.Rarity.DisplayName}</p>
19
+ <p>Rarity Number: {data.Rarity.RarityNumber}</p>
20
+ {data.Tradable && <p>Tradable: Yes</p>}
21
+ {data.CanBeShiny && <p>Can Be Shiny: Yes</p>}
22
+ {data.HoverHeight && <p>Hover Height: {data.HoverHeight}</p>}
23
+ {data.RotationLimit && <p>Rotation Limit: {data.RotationLimit}</p>}
24
+ {data.ProductId && <p>Product ID: {data.ProductId}</p>}
25
+ {data.Animation && <p>Animation: {data.Animation}</p>}
26
+ {data.BobRate && <p>Bob Rate: {data.BobRate}</p>}
27
+ {data.PitchScale && <p>Pitch Scale: {data.PitchScale}</p>}
28
+ {data.MaxRoll && <p>Max Roll: {data.MaxRoll}</p>}
29
+ {data.DefaultJumpSpeedBoost && (
30
+ <p>Default Jump Speed Boost: {data.DefaultJumpSpeedBoost}</p>
31
+ )}
32
+ {data.IdleVolumeSpeedScale && (
33
+ <p>Idle Volume Speed Scale: {data.IdleVolumeSpeedScale}</p>
34
+ )}
35
+ {data.IdlePitchScale && (
36
+ <p>Idle Pitch Scale: {data.IdlePitchScale}</p>
37
+ )}
38
+ {data.BlockcastScale && <p>Blockcast Scale: {data.BlockcastScale}</p>}
39
+ {data.SkateMode && <p>Skate Mode: Yes</p>}
40
+ {data.IdleVolume && <p>Idle Volume: {data.IdleVolume}</p>}
41
+ </div>
42
+ )}
43
+ />
44
+ );
45
+ };
46
+
47
+ export default HoverboardsComponent;
@@ -0,0 +1,64 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { PetSimulator99API } from "ps99-api";
3
+
4
+ interface ImageProps {
5
+ src: string;
6
+ alt: string;
7
+ }
8
+
9
+ const MAX_CONCURRENT_REQUESTS = 5;
10
+ let currentRequests = 0;
11
+ const queue: (() => void)[] = [];
12
+
13
+ const processQueue = () => {
14
+ if (queue.length > 0 && currentRequests < MAX_CONCURRENT_REQUESTS) {
15
+ const nextRequest = queue.shift();
16
+ if (nextRequest) {
17
+ currentRequests++;
18
+ nextRequest();
19
+ }
20
+ }
21
+ };
22
+
23
+ const ImageComponent: React.FC<ImageProps> = ({ src, alt }) => {
24
+ const [imageUrl, setImageUrl] = useState<string | null>(null);
25
+ const [error, setError] = useState<string | null>(null);
26
+
27
+ useEffect(() => {
28
+ const fetchImage = async () => {
29
+ try {
30
+ const api = new PetSimulator99API();
31
+ const imageBlob = await api.getImage(src);
32
+ const imageUrl = URL.createObjectURL(new Blob([imageBlob], { type: "image/png" }));
33
+ setImageUrl(imageUrl);
34
+ } catch (error) {
35
+ setError("Error fetching image");
36
+ console.error("Error fetching image:", error);
37
+ } finally {
38
+ currentRequests--;
39
+ processQueue();
40
+ }
41
+ };
42
+
43
+ const load = () => {
44
+ fetchImage();
45
+ };
46
+
47
+ queue.push(load);
48
+ processQueue();
49
+
50
+ return () => {
51
+ if (imageUrl) {
52
+ URL.revokeObjectURL(imageUrl);
53
+ }
54
+ };
55
+ }, [src, imageUrl]);
56
+
57
+ if (error) {
58
+ return <div>{error}</div>;
59
+ }
60
+
61
+ return <div>{imageUrl ? <img src={imageUrl} alt={alt} /> : <p>Loading...</p>}</div>;
62
+ };
63
+
64
+ export default ImageComponent;
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+ import ImageComponent from "./ImageComponent";
5
+
6
+ const LootboxesComponent: React.FC<{
7
+ configData?: CollectionConfigData<"Lootboxes">;
8
+ }> = ({ configData }) => {
9
+ return (
10
+ <GenericFetchComponent<CollectionConfigData<"Lootboxes">>
11
+ collectionName="Lootboxes"
12
+ configData={configData}
13
+ render={(data) => (
14
+ <div>
15
+ <h2>{data.DisplayName}</h2>
16
+ <ImageComponent src={data.Icon} alt={data.DisplayName} />
17
+ <p>Description: {data.Desc}</p>
18
+ <p>Rarity: {data.Rarity.DisplayName}</p>
19
+ <p>Rarity Number: {data.Rarity.RarityNumber}</p>
20
+ </div>
21
+ )}
22
+ />
23
+ );
24
+ };
25
+
26
+ export default LootboxesComponent;
@@ -0,0 +1,56 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+ import ImageComponent from "./ImageComponent";
5
+
6
+ const MasteryComponent: React.FC<{
7
+ configData?: CollectionConfigData<"Mastery">;
8
+ }> = ({ configData }) => {
9
+ const renderPerks = (perks: any) => {
10
+ return Object.entries(perks).map(
11
+ ([perkType, perkDetails]: [string, any]) => (
12
+ <div key={perkType}>
13
+ <h3>{perkType}</h3>
14
+ {perkDetails.map((detail: any, index: number) => (
15
+ <div key={index}>
16
+ <p>Level: {detail.Level}</p>
17
+ <p>Title: {detail.Title}</p>
18
+ <p>Description: {detail.Text}</p>
19
+ {detail.Power && <p>Power: {detail.Power}</p>}
20
+ </div>
21
+ ))}
22
+ </div>
23
+ ),
24
+ );
25
+ };
26
+
27
+ return (
28
+ <GenericFetchComponent<CollectionConfigData<"Mastery">>
29
+ collectionName="Mastery"
30
+ configData={configData}
31
+ render={(data) => (
32
+ <div>
33
+ <h2>{data.Name}</h2>
34
+ <ImageComponent src={data.Icon} alt={data.Name} />
35
+ <p>Description: {data.Desc}</p>
36
+ {data.ToggleablePerks && (
37
+ <div>
38
+ <h3>Toggleable Perks</h3>
39
+ {Object.entries(data.ToggleablePerks).map(([perk, value]) => (
40
+ <p key={perk}>
41
+ {perk}: {value ? "Enabled" : "Disabled"}
42
+ </p>
43
+ ))}
44
+ </div>
45
+ )}
46
+ <div>
47
+ <h3>Perks</h3>
48
+ {renderPerks(data.Perks)}
49
+ </div>
50
+ </div>
51
+ )}
52
+ />
53
+ );
54
+ };
55
+
56
+ export default MasteryComponent;
@@ -0,0 +1,45 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+
5
+ const MerchantComponent: React.FC<{
6
+ configData?: CollectionConfigData<"Merchants">;
7
+ }> = ({ configData }) => {
8
+ const renderStockRange = (stockRange: number[][] | undefined) => {
9
+ if (!stockRange) return null;
10
+ return stockRange.map((range, index) => (
11
+ <div key={index}>
12
+ <p>
13
+ Level {index + 1}: {range[0]} - {range[1]}
14
+ </p>
15
+ </div>
16
+ ));
17
+ };
18
+
19
+ return (
20
+ <GenericFetchComponent<CollectionConfigData<"Merchants">>
21
+ collectionName="Merchants"
22
+ configData={configData}
23
+ render={(data) => (
24
+ <div>
25
+ <h2>{data.DisplayName}</h2>
26
+ <p>Price Multiplier: {data.PriceMult}</p>
27
+ <p>Machine Name: {data.MachineName}</p>
28
+ <p>Refresh Rate: {data.RefreshRate} seconds</p>
29
+ {data.HideNotification && <p>Notification: Hidden</p>}
30
+ {data.HideRespect && <p>Respect: Hidden</p>}
31
+ {data.IsStatic && <p>Static Merchant</p>}
32
+ {renderStockRange(data.StockRangeByRespectLevel)}
33
+ {data.SlotRespectLevels && (
34
+ <div>
35
+ <h3>Slot Respect Levels</h3>
36
+ <p>{data.SlotRespectLevels.join(", ")}</p>
37
+ </div>
38
+ )}
39
+ </div>
40
+ )}
41
+ />
42
+ );
43
+ };
44
+
45
+ export default MerchantComponent;
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ import { CollectionConfigData } from "ps99-api";
3
+ import { GenericFetchComponent } from "./GenericFetchComponent";
4
+ import ImageComponent from "./ImageComponent";
5
+
6
+ const MiscItemsComponent: React.FC<{
7
+ configData?: CollectionConfigData<"MiscItems">;
8
+ }> = ({ configData }) => {
9
+ return (
10
+ <GenericFetchComponent<CollectionConfigData<"MiscItems">>
11
+ collectionName="MiscItems"
12
+ configData={configData}
13
+ render={(data) => (
14
+ <div>
15
+ <h2>{data.DisplayName}</h2>
16
+ <p>Category: {data.Category}</p>
17
+ <ImageComponent src={data.Icon} alt={data.DisplayName} />
18
+ {data.AltIcon && (
19
+ <ImageComponent
20
+ src={data.AltIcon}
21
+ alt={`${data.DisplayName} (Alternate)`}
22
+ />
23
+ )}
24
+ <p>Description: {data.Desc}</p>
25
+ <p>
26
+ Rarity: {data.Rarity.DisplayName} (Rarity Number:{" "}
27
+ {data.Rarity.RarityNumber})
28
+ </p>
29
+ {data.Tradable && <p>Tradable: Yes</p>}
30
+ {!data.Tradable && <p>Tradable: No</p>}
31
+ </div>
32
+ )}
33
+ />
34
+ );
35
+ };
36
+
37
+ export default MiscItemsComponent;