Skip to content

Commit

Permalink
Example: effects (#68)
Browse files Browse the repository at this point in the history
  • Loading branch information
abstractalgo authored Sep 26, 2023
1 parent 303e90a commit 21ae12f
Show file tree
Hide file tree
Showing 16 changed files with 3,866 additions and 0 deletions.
16 changes: 16 additions & 0 deletions map-sdk/effects-example/.eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/** @type import('eslint').Linter.Config */
module.exports = {
root: true,
env: {browser: true, es2020: true},
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react-hooks/recommended'
],
ignorePatterns: ['dist', '.eslintrc.cjs'],
parser: '@typescript-eslint/parser',
plugins: ['react-refresh'],
rules: {
'react-refresh/only-export-components': ['warn', {allowConstantExport: true}]
}
};
24 changes: 24 additions & 0 deletions map-sdk/effects-example/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
.yarn
1 change: 1 addition & 0 deletions map-sdk/effects-example/.yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nodeLinker: node-modules
35 changes: 35 additions & 0 deletions map-sdk/effects-example/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Map SDK basic example

A Map SDK effects example.

This is an example for Foursquare's [Map SDK](https://location.foursquare.com/developer/docs/studio-map-sdk-introduction) that allows you to programmatically render [Foursquare Studio](https://studio.foursquare.com/) maps within your website and with your own data.

The project was bootstrapped with [Vite](https://vitejs.dev/guide/).

## Available Scripts

In the project directory, you can run:

### `yarn dev`

Runs the app in the development mode.\
By default, the app is available at [http://localhost:5173](http://localhost:5173/) in your browser.

The page will reload when you make edits.\
You will also see any lint errors in the console.

### `yarn build`

Builds and bundles the app for production into the `dist` folder.

### `yarn preview`

Runs a server to locally preview the production build.

If you don't use `yarn dev`, you likely would want to use `yarn build` and `yarn preview` together.

## Learn More

You can learn more about [setting up a React app with Vite](https://react.dev/learn/add-react-to-an-existing-project) and on the official [Vite webiste](https://vitejs.dev/guide/).

To learn React, check out the [React documentation](https://react.dev/).
15 changes: 15 additions & 0 deletions map-sdk/effects-example/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8" />
<link rel="icon" href="/fsq-favicon.png" />
<title>Effects Example</title>
</head>

<body>
<script type="module" src="/src/index.tsx"></script>
<div id="root"></div>
</body>

</html>
30 changes: 30 additions & 0 deletions map-sdk/effects-example/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "example-template",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
"dependencies": {
"@unfolded/map-sdk": "^1.10.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/eslint": "^8.44.2",
"@types/react": "^18.2.18",
"@types/react-dom": "^18.2.7",
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@typescript-eslint/parser": "^6.2.1",
"@vitejs/plugin-react": "^4.0.4",
"eslint": "^8.46.0",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.3",
"typescript": "^5.2.2",
"vite": "^4.4.9"
}
}
Binary file added map-sdk/effects-example/public/fsq-favicon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
116 changes: 116 additions & 0 deletions map-sdk/effects-example/src/App.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import {FC, useEffect, useMemo, useRef, useState} from 'react';
import {createMap, MapApi} from '@unfolded/map-sdk';
import {SampleDataItem, fetchSampleData} from './sample-data';

export const App: FC = () => {
const containerRef = useRef<HTMLDivElement>(null);
const [map, setMap] = useState<MapApi | null>(null);
const [sampleData, setSampleData] = useState<[SampleDataItem] | null>(null);

useEffect(() => {
const loadData = async () => {
setSampleData(await fetchSampleData());
};

const initMap = async () => {
const map = await createMap({
container: containerRef.current!
});
setMap(map);
};

initMap();
loadData();
}, []);

useEffect(() => {
if (map && sampleData && sampleData.length > 0) {
map.addDataset(sampleData[0], {autoCreateLayers: false});
map.addLayer({
type: 'grid',
dataId: 'earthquakes',
fields: {
lat: 'Latitude',
lng: 'Longitude'
},
config: {
visConfig: {
worldUnitSize: 26,
elevationScale: 90,
enable3d: true
}
}
});
map.setMapConfig({
version: 'v1',
config: {
mapState: {
pitch: 50,
bearing: 24,
mapViewMode: 'MODE_3D'
}
}
});
map.setView({
latitude: 36.7045671093519,
longitude: -122.47582941779496,
zoom: 5.920306814575524
});
}
}, [map, sampleData]);

const handlers = useMemo(() => {
if (!sampleData) {
console.log('Data not yet loaded.');
return null;
}

if (!map) {
console.log('Map not yet initialized.');
return null;
}

return {
addEffectLightShadow: () => {
map.addEffect({
type: 'light-and-shadow',
parameters: {
timeMode: 'pick',
timestamp: 1695250260000
}
});
},
addEffectHexagonalPixelate: () => {
map.addEffect({
type: 'hexagonal-pixelate',
parameters: {
scale: 8.5
}
});
},
addEffectHueSaturation: () => {
map.addEffect({
type: 'hue-saturation',
parameters: {
hue: 0.6,
saturation: 0.4
}
});
}
};
}, [map, sampleData]);

return (
<>
<div id="map-container" ref={containerRef}></div>
{!!handlers && (
<div className="controls">
{/* Buttons for various effect operations */}
<button onClick={handlers.addEffectLightShadow}>Light and Shadow</button>
<button onClick={handlers.addEffectHexagonalPixelate}>Hexagonal Pixelate</button>
<button onClick={handlers.addEffectHueSaturation}>Hue and Saturation</button>
</div>
)}
</>
);
};
20 changes: 20 additions & 0 deletions map-sdk/effects-example/src/index.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
body {
margin: 0;
padding: 0;
}

#map-container {
width: 100vw;
height: 100vh;
overflow: hidden;
}

.controls {
position: fixed;
right: 0;
bottom: 0;
margin: 20px;
display: flex;
gap: 5px;
flex-direction: column;
}
5 changes: 5 additions & 0 deletions map-sdk/effects-example/src/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import {createRoot} from 'react-dom/client';
import './index.css';
import {App} from './App';

createRoot(document.getElementById('root')!).render(<App />);
20 changes: 20 additions & 0 deletions map-sdk/effects-example/src/sample-data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const BASE_URL = `https://4sq-studio-public.s3.us-west-2.amazonaws.com/sdk/examples/sample-data`;

export type SampleDataItem = {
id: string;
label: string;
data: object;
};

export const fetchSampleData = async (): Promise<[SampleDataItem]> => {
const responses = await Promise.all([fetch(`${BASE_URL}/earthquakes.json`)]);

const data = await Promise.all(responses.map(r => r.json()));
return [
{
id: 'earthquakes',
label: 'Earthquakes',
data: data[0]
}
];
};
25 changes: 25 additions & 0 deletions map-sdk/effects-example/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,

/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",

/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
10 changes: 10 additions & 0 deletions map-sdk/effects-example/tsconfig.node.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"]
}
7 changes: 7 additions & 0 deletions map-sdk/effects-example/vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import {defineConfig} from 'vite';
import react from '@vitejs/plugin-react';

// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()]
});
Loading

0 comments on commit 21ae12f

Please sign in to comment.