51 |
52 |
80 |
81 |
82 |
83 |
86 | {showWidgetsSettings &&
}
87 |
88 | div>
89 | );
90 | }
91 |
92 | export default Homepage;
93 |
--------------------------------------------------------------------------------
/hyperdrive/packages/homepage/ui/src/store/homepageStore.ts:
--------------------------------------------------------------------------------
1 | import { create } from 'zustand'
2 | import { persist, createJSONStorage } from 'zustand/middleware'
3 |
4 | export interface HomepageApp {
5 | id: string,
6 | process: string,
7 | package_name: string,
8 | publisher: string,
9 | path?: string
10 | label: string,
11 | base64_icon?: string,
12 | widget?: string
13 | order: number
14 | favorite: boolean
15 | }
16 |
17 | export interface HomepageStore {
18 | get: () => HomepageStore
19 | set: (partial: HomepageStore | Partial
) => void
20 |
21 | apps: HomepageApp[]
22 | setApps: (apps: HomepageApp[]) => void
23 | showWidgetsSettings: boolean
24 | setShowWidgetsSettings: (showWidgetsSettings: boolean) => void
25 | }
26 |
27 | const useHomepageStore = create()(
28 | persist(
29 | (set, get) => ({
30 | get,
31 | set,
32 | apps: [],
33 | setApps: (apps: HomepageApp[]) => set({ apps }),
34 | showWidgetsSettings: false,
35 | setShowWidgetsSettings: (showWidgetsSettings: boolean) => set({ showWidgetsSettings }),
36 | }),
37 | {
38 | name: 'homepage_store', // unique name
39 | storage: createJSONStorage(() => sessionStorage), // (optional) by default, 'localStorage' is used
40 | }
41 | )
42 | )
43 |
44 | export default useHomepageStore
45 |
--------------------------------------------------------------------------------
/hyperdrive/packages/homepage/ui/src/store/persistentStore.ts:
--------------------------------------------------------------------------------
1 | import { create } from 'zustand';
2 | import { createJSONStorage, persist } from 'zustand/middleware';
3 |
4 | export interface PersistentStore {
5 | get: () => PersistentStore
6 | set: (state: PersistentStore | Partial) => void
7 | widgetSettings: {
8 | [key: string]: {
9 | hide?: boolean,
10 | size?: 'small' | 'large',
11 | }
12 | }
13 | setWidgetSettings: (widgetSettings: PersistentStore['widgetSettings']) => void
14 | toggleWidgetVisibility: (package_id: string) => void
15 | setWidgetSize: (package_id: string, size: 'small' | 'large') => void,
16 | widgetOrder: string[]
17 | setWidgetOrder: (widgetOrder: string[]) => void
18 | appOrder: string[]
19 | setAppOrder: (appOrder: string[]) => void
20 | }
21 |
22 | const usePersistentStore = create()(
23 | persist(
24 | (set, get) => ({
25 | get,
26 | set,
27 | widgetSettings: {},
28 | setWidgetSettings: (widgetSettings: PersistentStore['widgetSettings']) => set({ widgetSettings }),
29 | toggleWidgetVisibility: (package_id: string) => {
30 | const { widgetSettings } = get()
31 | set({
32 | widgetSettings: {
33 | ...widgetSettings,
34 | [package_id]: {
35 | ...widgetSettings[package_id],
36 | hide: !widgetSettings[package_id]?.hide
37 | }
38 | }
39 | })
40 | },
41 | setWidgetSize: (package_id: string, size: 'small' | 'large') => {
42 | const { widgetSettings } = get()
43 | set({
44 | widgetSettings: {
45 | ...widgetSettings,
46 | [package_id]: {
47 | ...widgetSettings[package_id],
48 | size
49 | }
50 | }
51 | })
52 | },
53 | widgetOrder: [],
54 | setWidgetOrder: (widgetOrder: string[]) => set({ widgetOrder }),
55 | appOrder: [],
56 | setAppOrder: (appOrder: string[]) => set({ appOrder }),
57 | }),
58 | {
59 | name: 'homepage_persistent_store', // unique name for the store
60 | storage: createJSONStorage(() => localStorage),
61 | }
62 | )
63 | );
64 |
65 | export default usePersistentStore;
--------------------------------------------------------------------------------
/hyperdrive/packages/homepage/ui/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | interface ImportMetaEnv {
4 | readonly VITE_APP_TITLE: string;
5 | readonly REACT_APP_MAINNET_RPC_URL: string;
6 | readonly REACT_APP_SEPOLIA_RPC_URL: string;
7 | readonly VITE_NODE_URL: string;
8 | // Add other environment variables as needed
9 | }
10 |
11 | interface ImportMeta {
12 | readonly env: ImportMetaEnv;
13 | }
--------------------------------------------------------------------------------
/hyperdrive/packages/homepage/ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "noEmit": true,
15 | "jsx": "react-jsx",
16 |
17 | /* Linting */
18 | "strict": true,
19 | "noUnusedLocals": true,
20 | "noUnusedParameters": true,
21 | "noFallthroughCasesInSwitch": true
22 | },
23 | "include": ["src"],
24 | "references": [{ "path": "./tsconfig.node.json" }]
25 | }
26 |
--------------------------------------------------------------------------------
/hyperdrive/packages/homepage/ui/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler",
7 | "allowSyntheticDefaultImports": true,
8 | "strict": true
9 | },
10 | "include": ["vite.config.ts"]
11 | }
12 |
--------------------------------------------------------------------------------
/hyperdrive/packages/homepage/ui/uno.config.ts:
--------------------------------------------------------------------------------
1 | ../../../../css/uno.config.ts
--------------------------------------------------------------------------------
/hyperdrive/packages/homepage/ui/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 | import UnoCSS from '@unocss/vite'
4 |
5 | /*
6 | If you are developing a UI outside of a Hyperware project,
7 | comment out the following 2 lines:
8 | */
9 | import manifest from '../pkg/manifest.json'
10 | import metadata from '../metadata.json'
11 |
12 | /*
13 | IMPORTANT:
14 | This must match the process name from pkg/manifest.json + pkg/metadata.json
15 | The format is "/" + "process_name:package_name:publisher_node"
16 | */
17 | const BASE_URL = `/`;
18 |
19 | // This is the proxy URL, it must match the node you are developing against
20 | const PROXY_URL = (process.env.VITE_NODE_URL || 'http://127.0.0.1:8080').replace('localhost', '127.0.0.1');
21 |
22 | export default defineConfig({
23 | plugins: [
24 | react(),
25 | UnoCSS(),
26 | ],
27 | base: BASE_URL,
28 | build: {
29 | rollupOptions: {
30 | external: ['/our.js']
31 | }
32 | },
33 | server: {
34 | open: true,
35 | proxy: {
36 | '^/our\\.js': {
37 | target: PROXY_URL,
38 | changeOrigin: true,
39 | rewrite: (path) => {
40 | return '/our.js';
41 | },
42 | },
43 | '^/hyperware\\.css': {
44 | target: PROXY_URL,
45 | changeOrigin: true,
46 | rewrite: (path) => {
47 | return '/hyperware.css';
48 | },
49 | },
50 | '^/version': {
51 | target: PROXY_URL,
52 | changeOrigin: true,
53 | rewrite: (path) => {
54 | return '/version';
55 | },
56 | },
57 | '^/apps': {
58 | target: PROXY_URL,
59 | changeOrigin: true,
60 | rewrite: (path) => {
61 | return '/apps';
62 | },
63 | },
64 | '^/favorite': {
65 | target: PROXY_URL,
66 | changeOrigin: true,
67 | rewrite: (path) => {
68 | return '/favorite';
69 | },
70 | },
71 | },
72 |
73 |
74 | },
75 | });
76 |
--------------------------------------------------------------------------------
/hyperdrive/packages/settings/Cargo.toml:
--------------------------------------------------------------------------------
1 | [workspace]
2 | resolver = "2"
3 | members = [
4 | "settings",
5 | ]
6 |
7 | [profile.release]
8 | panic = "abort"
9 | opt-level = "s"
10 | lto = true
11 |
--------------------------------------------------------------------------------
/hyperdrive/packages/settings/api/settings:sys-v0.wit:
--------------------------------------------------------------------------------
1 | interface settings {
2 | variant request {
3 | /// lazy-load-blob: none.
4 | hi(hi-request),
5 | /// lazy-load-blob: none.
6 | peer-id(string),
7 | /// lazy-load-blob: none.
8 | eth-config(eth-config-request),
9 | /// lazy-load-blob: none.
10 | shutdown,
11 | /// lazy-load-blob: none.
12 | reset,
13 | /// lazy-load-blob: none.
14 | kill-process(string),
15 | /// lazy-load-blob: none.
16 | set-stylesheet(string),
17 | }
18 |
19 | type response = result