diff --git a/.github/workflows/frontend-cicd.yaml b/.github/workflows/frontend-cicd.yaml
index 43d68a0a..5b252ab2 100644
--- a/.github/workflows/frontend-cicd.yaml
+++ b/.github/workflows/frontend-cicd.yaml
@@ -92,6 +92,7 @@ jobs:
build-args: |
REACT_APP_API_URL=${{ vars.REACT_APP_API_URL }}
REACT_APP_SENTRY_DSN=${{ secrets.REACT_APP_SENTRY_DSN }}
+ REACT_APP_PUBLIC_URL=${{ vars.REACT_APP_PUBLIC_URL }}
outputs: type=docker,dest=/tmp/docker_image.tar
- name: Upload artifact
diff --git a/backend/internal/usecase/mocks/mocks.go b/backend/internal/usecase/mocks/mocks.go
index e6767185..c70a1c6c 100644
--- a/backend/internal/usecase/mocks/mocks.go
+++ b/backend/internal/usecase/mocks/mocks.go
@@ -1139,6 +1139,21 @@ func (mr *MockLogTransactionRepoInterfaceMockRecorder) GetLogTransactionsByUserI
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLogTransactionsByUserID", reflect.TypeOf((*MockLogTransactionRepoInterface)(nil).GetLogTransactionsByUserID), userID, timeRange)
}
+// LogTransactionSupplyByAssetID mocks base method.
+func (m *MockLogTransactionRepoInterface) LogTransactionSupplyByAssetID(assetID int, timeRange, periodInitial, interval string) (entity.LogTransactionSupply, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "LogTransactionSupplyByAssetID", assetID, timeRange, periodInitial, interval)
+ ret0, _ := ret[0].(entity.LogTransactionSupply)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// LogTransactionSupplyByAssetID indicates an expected call of LogTransactionSupplyByAssetID.
+func (mr *MockLogTransactionRepoInterfaceMockRecorder) LogTransactionSupplyByAssetID(assetID, timeRange, periodInitial, interval interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LogTransactionSupplyByAssetID", reflect.TypeOf((*MockLogTransactionRepoInterface)(nil).LogTransactionSupplyByAssetID), assetID, timeRange, periodInitial, interval)
+}
+
// StoreLogTransaction mocks base method.
func (m *MockLogTransactionRepoInterface) StoreLogTransaction(arg0 entity.LogTransaction) error {
m.ctrl.T.Helper()
@@ -1153,6 +1168,21 @@ func (mr *MockLogTransactionRepoInterfaceMockRecorder) StoreLogTransaction(arg0
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreLogTransaction", reflect.TypeOf((*MockLogTransactionRepoInterface)(nil).StoreLogTransaction), arg0)
}
+// SumLogTransactionSupply mocks base method.
+func (m *MockLogTransactionRepoInterface) SumLogTransactionSupply(timeRange string, timeFrame time.Duration) ([]entity.SumLogTransactionSupply, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "SumLogTransactionSupply", timeRange, timeFrame)
+ ret0, _ := ret[0].([]entity.SumLogTransactionSupply)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// SumLogTransactionSupply indicates an expected call of SumLogTransactionSupply.
+func (mr *MockLogTransactionRepoInterfaceMockRecorder) SumLogTransactionSupply(timeRange, timeFrame interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SumLogTransactionSupply", reflect.TypeOf((*MockLogTransactionRepoInterface)(nil).SumLogTransactionSupply), timeRange, timeFrame)
+}
+
// SumLogTransactions mocks base method.
func (m *MockLogTransactionRepoInterface) SumLogTransactions(timeRange string, timeFrame time.Duration) ([]entity.SumLogTransaction, error) {
m.ctrl.T.Helper()
diff --git a/backend/internal/usecase/repo/asset_postgres.go b/backend/internal/usecase/repo/asset_postgres.go
index f8f9026f..ef96f46a 100644
--- a/backend/internal/usecase/repo/asset_postgres.go
+++ b/backend/internal/usecase/repo/asset_postgres.go
@@ -127,8 +127,8 @@ func (r AssetRepo) GetAssetByCode(code string) (entity.Asset, error) {
func (r AssetRepo) CreateAsset(data entity.Asset) (entity.Asset, error) {
res := data
- stmt := `INSERT INTO Asset (code, issuer_id, distributor_id, name, asset_type) VALUES ($1, $2, $3,$4, $5) RETURNING id;`
- err := r.Db.QueryRow(stmt, data.Code, data.Issuer.Id, data.Distributor.Id, data.Name, data.AssetType).Scan(&res.Id)
+ stmt := `INSERT INTO Asset (code, issuer_id, distributor_id, name, asset_type, image) VALUES ($1, $2, $3,$4, $5, $6) RETURNING id;`
+ err := r.Db.QueryRow(stmt, data.Code, data.Issuer.Id, data.Distributor.Id, data.Name, data.AssetType, data.Image).Scan(&res.Id)
if err != nil {
return entity.Asset{}, fmt.Errorf("AssetRepo - CreateAsset - db.QueryRow: %w", err)
}
diff --git a/backend/migrations/000027_asset_image.down.sql b/backend/migrations/000027_asset_image.down.sql
new file mode 100644
index 00000000..cb93810c
--- /dev/null
+++ b/backend/migrations/000027_asset_image.down.sql
@@ -0,0 +1 @@
+ALTER TABLE asset DROP COLUMN image;
\ No newline at end of file
diff --git a/backend/migrations/000027_asset_image.up.sql b/backend/migrations/000027_asset_image.up.sql
new file mode 100644
index 00000000..a4c5da83
--- /dev/null
+++ b/backend/migrations/000027_asset_image.up.sql
@@ -0,0 +1 @@
+ALTER TABLE asset ADD COLUMN image BYTEA;
\ No newline at end of file
diff --git a/frontend/.idea/workspace.xml b/frontend/.idea/workspace.xml
index 57c33e7a..60437f27 100644
--- a/frontend/.idea/workspace.xml
+++ b/frontend/.idea/workspace.xml
@@ -4,20 +4,66 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1692728747344
+
+
+ 1692728747344
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
index 68604d3e..02e12369 100644
--- a/frontend/Dockerfile
+++ b/frontend/Dockerfile
@@ -10,8 +10,10 @@ ENTRYPOINT [ "make", "start_dev"]
FROM base AS builder
ARG REACT_APP_API_URL
ARG REACT_APP_SENTRY_DSN
+ARG REACT_APP_PUBLIC_URL
ENV REACT_APP_API_URL=${REACT_APP_API_URL:?"ERR: REACT_APP_API_URL not set in Dockerfile"}
ENV REACT_APP_SENTRY_DSN=${REACT_APP_SENTRY_DSN:?"ERR: REACT_APP_SENTRY_DSN not set in Dockerfile"}
+ENV PUBLIC_URL=${REACT_APP_PUBLIC_URL:?"ERR: REACT_APP_PUBLIC_URL not set in Dockerfile"}
RUN make build
FROM node:16.13-bullseye-slim AS remote
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 6bd2ee5c..e3e7cd65 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -42,12 +42,16 @@
"react-feather": "^2.0.10",
"react-hook-form": "~7.43.5",
"react-intl": "^6.3.2",
+ "react-number-format": "^5.3.1",
+ "react-player": "^2.13.0",
"react-router-dom": "~6.9.0",
"react-scripts": "~5.0.1",
"react-select": "^5.7.0",
+ "react-slick": "^0.29.0",
"react-timeago": "^7.1.0",
"sass": "~1.59.2",
"soroban-client": "0.9.2",
+ "swiper": "^10.2.0",
"typescript": "~4.9.5",
"web-vitals": "~3.3.0",
"yup": "~1.0.2"
@@ -72,6 +76,7 @@
"@types/node-sass": "^4.11.3",
"@types/react": "~18.0.28",
"@types/react-router-dom": "~5.3.3",
+ "@types/react-slick": "^0.23.10",
"@types/react-timeago": "^4.1.3",
"@types/sinon": "~10.0.13",
"@typescript-eslint/eslint-plugin": "^5.55.0",
@@ -11248,6 +11253,15 @@
"@types/react-router": "*"
}
},
+ "node_modules/@types/react-slick": {
+ "version": "0.23.10",
+ "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.10.tgz",
+ "integrity": "sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
"node_modules/@types/react-timeago": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@types/react-timeago/-/react-timeago-4.1.3.tgz",
@@ -17218,6 +17232,11 @@
"node": ">=6"
}
},
+ "node_modules/enquire.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
+ "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw=="
+ },
"node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
@@ -24739,6 +24758,14 @@
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
},
+ "node_modules/json2mq": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+ "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "dependencies": {
+ "string-convert": "^0.2.0"
+ }
+ },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -25267,6 +25294,11 @@
"node": ">=0.10.0"
}
},
+ "node_modules/load-script": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
+ "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA=="
+ },
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -30006,6 +30038,38 @@
"react": ">=16.0.0"
}
},
+ "node_modules/react-number-format": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.1.tgz",
+ "integrity": "sha512-qpYcQLauIeEhCZUZY9jXZnnroOtdy3jYaS1zQ3M1Sr6r/KMOBEIGNIb7eKT19g2N1wbYgFgvDzs19hw5TrB8XQ==",
+ "dependencies": {
+ "prop-types": "^15.7.2"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-player": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.13.0.tgz",
+ "integrity": "sha512-gkY7ZdbVFztlKFFhCPcnDrFQm+L399b8fhWsKatZ+b2wpKJwfUHBXQFMRxqYQGT0ic1/wQ7D7EZEWy7ZBqk2pw==",
+ "dependencies": {
+ "deepmerge": "^4.0.0",
+ "load-script": "^1.0.0",
+ "memoize-one": "^5.1.1",
+ "prop-types": "^15.7.2",
+ "react-fast-compare": "^3.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0"
+ }
+ },
+ "node_modules/react-player/node_modules/memoize-one": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
+ },
"node_modules/react-refresh": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
@@ -30719,6 +30783,22 @@
"react-dom": "^0.14.0 || ^15.0.0-0 || ^16.0.0 || ^17.0.0"
}
},
+ "node_modules/react-slick": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz",
+ "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==",
+ "dependencies": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ },
+ "peerDependencies": {
+ "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/react-style-singleton": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
@@ -31336,6 +31416,11 @@
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
"node_modules/resolve": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
@@ -33070,6 +33155,11 @@
"node": ">=0.6.19"
}
},
+ "node_modules/string-convert": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
+ },
"node_modules/string-length": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -33543,6 +33633,24 @@
"node": ">=4"
}
},
+ "node_modules/swiper": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.2.0.tgz",
+ "integrity": "sha512-nktQsOtBInJjr3f5DicxC8eHYGcLXDVIGPSon0QoXRaO6NjKnATCbQ8SZsD3dN1Ph1RH4EhVPwSYCcuDRFWHGQ==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/swiperjs"
+ },
+ {
+ "type": "open_collective",
+ "url": "http://opencollective.com/swiper"
+ }
+ ],
+ "engines": {
+ "node": ">= 4.7.0"
+ }
+ },
"node_modules/symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
@@ -44772,6 +44880,15 @@
"@types/react-router": "*"
}
},
+ "@types/react-slick": {
+ "version": "0.23.10",
+ "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.10.tgz",
+ "integrity": "sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
"@types/react-timeago": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@types/react-timeago/-/react-timeago-4.1.3.tgz",
@@ -49280,6 +49397,11 @@
}
}
},
+ "enquire.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
+ "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw=="
+ },
"entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
@@ -54852,6 +54974,14 @@
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
},
+ "json2mq": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+ "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "requires": {
+ "string-convert": "^0.2.0"
+ }
+ },
"json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -55220,6 +55350,11 @@
}
}
},
+ "load-script": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
+ "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA=="
+ },
"loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -58627,6 +58762,33 @@
"resolved": "https://registry.npmjs.org/react-nanny/-/react-nanny-2.15.0.tgz",
"integrity": "sha512-fn6tAnJ+UEdD0pq5YytlZJb5XmjVcvXoxq3i2r1o/BavgipwRWsw7oOXNJ8bJd33iedlkNyAQMXVC6qTl0Hv4A=="
},
+ "react-number-format": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.1.tgz",
+ "integrity": "sha512-qpYcQLauIeEhCZUZY9jXZnnroOtdy3jYaS1zQ3M1Sr6r/KMOBEIGNIb7eKT19g2N1wbYgFgvDzs19hw5TrB8XQ==",
+ "requires": {
+ "prop-types": "^15.7.2"
+ }
+ },
+ "react-player": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.13.0.tgz",
+ "integrity": "sha512-gkY7ZdbVFztlKFFhCPcnDrFQm+L399b8fhWsKatZ+b2wpKJwfUHBXQFMRxqYQGT0ic1/wQ7D7EZEWy7ZBqk2pw==",
+ "requires": {
+ "deepmerge": "^4.0.0",
+ "load-script": "^1.0.0",
+ "memoize-one": "^5.1.1",
+ "prop-types": "^15.7.2",
+ "react-fast-compare": "^3.0.1"
+ },
+ "dependencies": {
+ "memoize-one": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
+ }
+ }
+ },
"react-refresh": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
@@ -59099,6 +59261,18 @@
"throttle-debounce": "^3.0.1"
}
},
+ "react-slick": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz",
+ "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==",
+ "requires": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ }
+ },
"react-style-singleton": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
@@ -59568,6 +59742,11 @@
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
+ "resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
"resolve": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
@@ -60938,6 +61117,11 @@
"integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
"dev": true
},
+ "string-convert": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
+ },
"string-length": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -61278,6 +61462,11 @@
}
}
},
+ "swiper": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.2.0.tgz",
+ "integrity": "sha512-nktQsOtBInJjr3f5DicxC8eHYGcLXDVIGPSon0QoXRaO6NjKnATCbQ8SZsD3dN1Ph1RH4EhVPwSYCcuDRFWHGQ=="
+ },
"symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 094e03ba..43094731 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -2,6 +2,7 @@
"name": "react-typescript",
"version": "0.1.0",
"private": true,
+ "homepage": "/sandbox/v2",
"dependencies": {
"@chakra-ui/react": "^2.5.5",
"@chakra-ui/theme-tools": "^2.0.18",
@@ -37,12 +38,16 @@
"react-feather": "^2.0.10",
"react-hook-form": "~7.43.5",
"react-intl": "^6.3.2",
+ "react-number-format": "^5.3.1",
+ "react-player": "^2.13.0",
"react-router-dom": "~6.9.0",
"react-scripts": "~5.0.1",
"react-select": "^5.7.0",
+ "react-slick": "^0.29.0",
"react-timeago": "^7.1.0",
"sass": "~1.59.2",
"soroban-client": "0.9.2",
+ "swiper": "^10.2.0",
"typescript": "~4.9.5",
"web-vitals": "~3.3.0",
"yup": "~1.0.2"
@@ -67,6 +72,7 @@
"@types/node-sass": "^4.11.3",
"@types/react": "~18.0.28",
"@types/react-router-dom": "~5.3.3",
+ "@types/react-slick": "^0.23.10",
"@types/react-timeago": "^4.1.3",
"@types/sinon": "~10.0.13",
"@typescript-eslint/eslint-plugin": "^5.55.0",
@@ -86,7 +92,7 @@
"start": "react-scripts start",
"start:dev": "env-cmd --silent -f ./src/config/.env.local npm start",
"start:staging": "env-cmd -f ./src/config/.env.staging npm start",
- "build": "react-scripts build",
+ "build": "react-scripts build && mkdir -p build/sandbox/v2/ && cp -Rp build/static build/sandbox/v2/",
"test": "react-scripts test",
"test:coverage": "npm run test -- --coverage --watchAll=false",
"eject": "react-scripts eject",
diff --git a/frontend/public/index.html b/frontend/public/index.html
index 9fec003c..b4e48f21 100644
--- a/frontend/public/index.html
+++ b/frontend/public/index.html
@@ -14,7 +14,10 @@
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
+
+
+