@reearth/core 0.0.7-alpha.42 → 0.0.7-alpha.43

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reearth/core",
3
- "version": "0.0.7-alpha.42",
3
+ "version": "0.0.7-alpha.43",
4
4
  "author": "Re:Earth contributors <community@reearth.io>",
5
5
  "license": "Apache-2.0",
6
6
  "description": "A library that abstracts a map engine as one common API.",
@@ -6,7 +6,7 @@ import { type Tile, useImageryProviders } from "./Imagery";
6
6
  test("useImageryProviders", () => {
7
7
  const provider = vi.fn(({ url }: { url?: string } = {}): any => ({ hoge: url }));
8
8
  const provider2 = vi.fn(({ url }: { url?: string } = {}): any => ({ hoge2: url }));
9
- const presets = { default: provider, foobar: provider2 };
9
+ const presets = { default: provider, default_label: provider2 };
10
10
  const { result, rerender } = renderHook(
11
11
  ({ tiles, cesiumIonAccessToken }: { tiles: Tile[]; cesiumIonAccessToken?: string }) =>
12
12
  useImageryProviders({
@@ -14,23 +14,28 @@ test("useImageryProviders", () => {
14
14
  presets,
15
15
  cesiumIonAccessToken,
16
16
  }),
17
- { initialProps: { tiles: [{ id: "1", type: "default" }] } },
17
+ { initialProps: { tiles: [{ id: "1", type: "default" }], cesiumIonAccessToken: undefined } },
18
18
  );
19
19
 
20
+ const typedRerender = rerender as (props: {
21
+ tiles: Tile[];
22
+ cesiumIonAccessToken?: string;
23
+ }) => void;
24
+
20
25
  expect(result.current.providers).toEqual({ "1": ["default", undefined, { hoge: undefined }] });
21
26
  expect(result.current.updated).toBe(true);
22
27
  expect(provider).toBeCalledTimes(1);
23
28
  const prevImageryProvider = result.current.providers["1"][2];
24
29
 
25
30
  // re-render with same tiles
26
- rerender({ tiles: [{ id: "1", type: "default" }] });
31
+ typedRerender({ tiles: [{ id: "1", type: "default" }] });
27
32
 
28
33
  expect(result.current.providers).toEqual({ "1": ["default", undefined, { hoge: undefined }] });
29
34
  expect(result.current.providers["1"][2]).toBe(prevImageryProvider); // 1's provider should be reused
30
35
  expect(provider).toBeCalledTimes(1);
31
36
 
32
37
  // update a tile URL
33
- rerender({ tiles: [{ id: "1", type: "default", url: "a" }] });
38
+ typedRerender({ tiles: [{ id: "1", type: "default", url: "a" }] });
34
39
 
35
40
  expect(result.current.providers).toEqual({ "1": ["default", "a", { hoge: "a" }] });
36
41
  expect(result.current.providers["1"][2]).not.toBe(prevImageryProvider);
@@ -40,7 +45,7 @@ test("useImageryProviders", () => {
40
45
  const prevImageryProvider2 = result.current.providers["1"][2];
41
46
 
42
47
  // add a tile with URL
43
- rerender({
48
+ typedRerender({
44
49
  tiles: [
45
50
  { id: "2", type: "default" },
46
51
  { id: "1", type: "default", url: "a" },
@@ -56,7 +61,7 @@ test("useImageryProviders", () => {
56
61
  expect(provider).toBeCalledTimes(3);
57
62
 
58
63
  // sort tiles
59
- rerender({
64
+ typedRerender({
60
65
  tiles: [
61
66
  { id: "1", type: "default", url: "a" },
62
67
  { id: "2", type: "default" },
@@ -72,7 +77,7 @@ test("useImageryProviders", () => {
72
77
  expect(provider).toBeCalledTimes(3);
73
78
 
74
79
  // delete a tile
75
- rerender({
80
+ typedRerender({
76
81
  tiles: [{ id: "1", type: "default", url: "a" }],
77
82
  cesiumIonAccessToken: "a",
78
83
  });
@@ -85,18 +90,31 @@ test("useImageryProviders", () => {
85
90
  expect(provider).toBeCalledTimes(4);
86
91
 
87
92
  // update a tile type
88
- rerender({
89
- tiles: [{ id: "1", type: "foobar", url: "u" }],
93
+ typedRerender({
94
+ tiles: [{ id: "1", type: "default_label", url: "u" }],
90
95
  cesiumIonAccessToken: "a",
91
96
  });
92
97
 
93
98
  expect(result.current.providers).toEqual({
94
- "1": ["foobar", "u", { hoge2: "u" }],
99
+ "1": ["default_label", "u", { hoge2: "u" }],
95
100
  });
96
101
  expect(result.current.updated).toBe(true);
97
102
  expect(provider).toBeCalledTimes(4);
98
103
  expect(provider2).toBeCalledTimes(1);
99
104
 
100
- rerender({ tiles: [] });
105
+ // update a tile type to unexpected type
106
+ typedRerender({
107
+ tiles: [{ id: "1", type: "unexpected_type", url: "u" }],
108
+ });
109
+
110
+ expect(result.current.providers).toEqual({
111
+ // unexpected type is treated as "default"
112
+ "1": ["unexpected_type", "u", { hoge: "u" }],
113
+ });
114
+ expect(result.current.updated).toBe(true);
115
+ expect(provider).toBeCalledTimes(5);
116
+ expect(provider2).toBeCalledTimes(1);
117
+
118
+ typedRerender({ tiles: [] });
101
119
  expect(result.current.providers).toEqual({});
102
120
  });
@@ -8,7 +8,7 @@ import { isEqual } from "lodash-es";
8
8
  import { useCallback, useMemo, useRef, useLayoutEffect, useState, useEffect } from "react";
9
9
  import { ImageryLayer } from "resium";
10
10
 
11
- import { tiles as tilePresets } from "./presets";
11
+ import { isValidPresetTileType, PresetTileType, tiles as tilePresets } from "./presets";
12
12
 
13
13
  export type ImageryLayerData = {
14
14
  id: string;
@@ -90,7 +90,7 @@ export function useImageryProviders({
90
90
  tiles?: Tile[];
91
91
  cesiumIonAccessToken?: string;
92
92
  presets: {
93
- [key: string]: (opts?: {
93
+ [K in PresetTileType]: (opts?: {
94
94
  url?: string;
95
95
  cesiumIonAccessToken?: string;
96
96
  heatmap?: boolean;
@@ -100,7 +100,7 @@ export function useImageryProviders({
100
100
  }): { providers: Providers; updated: boolean } {
101
101
  const newTile = useCallback(
102
102
  (t: Tile, ciat?: string) =>
103
- presets[t.type || "default"]({
103
+ presets[isValidPresetTileType(t.type) ? t.type : "default"]({
104
104
  url: t.url,
105
105
  cesiumIonAccessToken: ciat,
106
106
  heatmap: t.heatmap,
@@ -113,11 +113,14 @@ export function useImageryProviders({
113
113
  const tileKeys = tiles.map(t => t.id).join(",");
114
114
  const prevTileKeys = useRef(tileKeys);
115
115
  const prevProviders = useRef<Providers>({});
116
- const zoomLevels = useMemo(() => tiles.map(t => {
117
- if (t.id && t.zoomLevel) return { [t.id]: t.zoomLevel };
118
- return
119
- }),
120
- [tiles]);
116
+ const zoomLevels = useMemo(
117
+ () =>
118
+ tiles.map(t => {
119
+ if (t.id && t.zoomLevel) return { [t.id]: t.zoomLevel };
120
+ return;
121
+ }),
122
+ [tiles],
123
+ );
121
124
  const prevZoomLevels = useRef(zoomLevels);
122
125
 
123
126
  // Manage TileProviders so that TileProvider does not need to be recreated each time tiles are updated.
@@ -10,6 +10,22 @@ import {
10
10
 
11
11
  import { JapanGSIOptimalBVmapLabelImageryProvider } from "./labels/JapanGSIOptimalBVmapVectorMapLabel/JapanGSIOptimalBVmapLabelImageryProvider";
12
12
 
13
+ const PRESET_TILE_TYPES = [
14
+ "default",
15
+ "default_label",
16
+ "default_road",
17
+ "open_street_map",
18
+ "black_marble",
19
+ "japan_gsi_standard",
20
+ "url",
21
+ ];
22
+
23
+ export type PresetTileType = (typeof PRESET_TILE_TYPES)[number];
24
+
25
+ export const isValidPresetTileType = (type: string | undefined): type is PresetTileType => {
26
+ return PRESET_TILE_TYPES.includes(type as PresetTileType);
27
+ };
28
+
13
29
  export const tiles = {
14
30
  default: ({ cesiumIonAccessToken } = {}) =>
15
31
  IonImageryProvider.fromAssetId(IonWorldImageryStyle.AERIAL, {
@@ -26,8 +42,7 @@ export const tiles = {
26
42
  open_street_map: () =>
27
43
  new OpenStreetMapImageryProvider({
28
44
  url: "https://tile.openstreetmap.org",
29
- credit:
30
- '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
45
+ credit: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
31
46
  }),
32
47
  black_marble: ({ cesiumIonAccessToken } = {}) =>
33
48
  IonImageryProvider.fromAssetId(3812, {
@@ -43,15 +58,13 @@ export const tiles = {
43
58
  url
44
59
  ? new UrlTemplateImageryProvider({
45
60
  url,
46
- tileDiscardPolicy: heatmap
47
- ? new DiscardEmptyTileImagePolicy()
48
- : undefined,
61
+ tileDiscardPolicy: heatmap ? new DiscardEmptyTileImagePolicy() : undefined,
49
62
  minimumLevel: tile_zoomLevel?.[0],
50
63
  maximumLevel: tile_zoomLevel?.[1],
51
64
  })
52
65
  : null,
53
66
  } as {
54
- [key: string]: (opts?: {
67
+ [K in PresetTileType]: (opts?: {
55
68
  url?: string;
56
69
  cesiumIonAccessToken?: string;
57
70
  heatmap?: boolean;