diff --git a/apps/billets-app/App.tsx b/apps/billets-app/App.tsx index b6a68a09..e4ee4de8 100644 --- a/apps/billets-app/App.tsx +++ b/apps/billets-app/App.tsx @@ -4,8 +4,9 @@ import { useColorSchemeStorage } from '@/lib/storage' import { CommonScreenLayout } from '@/ui' import { colors, ColorScheme } from '@coldsurfers/ocean-road' import { ColorSchemeProvider, Spinner, Text, useColorScheme } from '@coldsurfers/ocean-road/native' +import { LogLevel, PerformanceProfiler, RenderPassReport } from '@shopify/react-native-performance' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import React, { memo, PropsWithChildren, Suspense, useEffect, useMemo, useState } from 'react' +import React, { memo, PropsWithChildren, Suspense, useCallback, useEffect, useMemo, useState } from 'react' import { Platform, useColorScheme as rnUseColorScheme, StatusBar, View } from 'react-native' import BootSplash from 'react-native-bootsplash' import codePush, { DownloadProgress, RemotePackage } from 'react-native-code-push' @@ -139,25 +140,41 @@ const App = () => { return systemColorScheme ?? 'light' }, [storageColorSchemeValue, systemColorScheme]) + const onReportPrepared = useCallback((report: RenderPassReport) => { + console.log('render report', report) + // monorail.produce(convertReportToMonorailObject(report)); + }, []) + + const errorHandler = useCallback((error: Error) => { + console.error(error) + }, []) + return ( - - - - - - - }> - - - - - - - - - - - + + + + + + + + }> + + + + + + + + + + + + ) } diff --git a/apps/billets-app/android/app/build.gradle b/apps/billets-app/android/app/build.gradle index 18719da1..d0fcffdd 100644 --- a/apps/billets-app/android/app/build.gradle +++ b/apps/billets-app/android/app/build.gradle @@ -97,8 +97,8 @@ android { applicationId "com.fstvllife.android" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 16 - versionName "1.6.7" + versionCode 17 + versionName "1.6.8" resValue "string", "CodePushDeploymentKey", project.env.get("ANDROID_CODE_PUSH_DEPLOYMENT_KEY") ?: "" } diff --git a/apps/billets-app/android/app/src/main/java/com/fstvllife/android/MainApplication.kt b/apps/billets-app/android/app/src/main/java/com/fstvllife/android/MainApplication.kt index 7d594325..b33c397e 100644 --- a/apps/billets-app/android/app/src/main/java/com/fstvllife/android/MainApplication.kt +++ b/apps/billets-app/android/app/src/main/java/com/fstvllife/android/MainApplication.kt @@ -10,8 +10,8 @@ import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.soloader.SoLoader -import org.wonday.orientation.OrientationActivityLifecycle import com.microsoft.codepush.react.CodePush +import com.shopify.reactnativeperformance.ReactNativePerformance class MainApplication : Application(), ReactApplication { @@ -40,12 +40,12 @@ class MainApplication : Application(), ReactApplication { get() = getDefaultReactHost(applicationContext, reactNativeHost) override fun onCreate() { - super.onCreate() - SoLoader.init(this, false) -// registerActivityLifecycleCallbacks(OrientationActivityLifecycle.getInstance()); - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - load() - } + ReactNativePerformance.onAppStarted() + super.onCreate() + SoLoader.init(this, false) + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + load() + } } } diff --git a/apps/billets-app/app.config.js b/apps/billets-app/app.config.js index 7b817ad4..3356740d 100644 --- a/apps/billets-app/app.config.js +++ b/apps/billets-app/app.config.js @@ -61,4 +61,4 @@ const appConfig = { }, } -module.exports = appConfig +export default appConfig diff --git a/apps/billets-app/ios/FstvlLifeApp.xcodeproj/project.pbxproj b/apps/billets-app/ios/FstvlLifeApp.xcodeproj/project.pbxproj index 34765f39..01d21c1e 100644 --- a/apps/billets-app/ios/FstvlLifeApp.xcodeproj/project.pbxproj +++ b/apps/billets-app/ios/FstvlLifeApp.xcodeproj/project.pbxproj @@ -600,7 +600,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.6.7; + MARKETING_VERSION = 1.6.8; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -632,7 +632,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.6.7; + MARKETING_VERSION = 1.6.8; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -923,7 +923,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.6.7; + MARKETING_VERSION = 1.6.8; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/apps/billets-app/ios/FstvlLifeApp/AppDelegate.mm b/apps/billets-app/ios/FstvlLifeApp/AppDelegate.mm index 9609f45d..14d09ee5 100644 --- a/apps/billets-app/ios/FstvlLifeApp/AppDelegate.mm +++ b/apps/billets-app/ios/FstvlLifeApp/AppDelegate.mm @@ -7,12 +7,13 @@ #import #import "RNBootSplash.h" -//#import "Orientation.h" +#import @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [ReactNativePerformance onAppStarted]; [FIRApp configure]; self.moduleName = @"FstvlLifeApp"; // You can add your custom initial props in the dictionary below. diff --git a/apps/billets-app/ios/Podfile.lock b/apps/billets-app/ios/Podfile.lock index 0c1c3ba0..00bde96b 100644 --- a/apps/billets-app/ios/Podfile.lock +++ b/apps/billets-app/ios/Podfile.lock @@ -7,6 +7,29 @@ PODS: - AppAuth/Core - Base64 (1.1.2) - boost (1.84.0) + - callstack-repack (5.0.0-rc.10): + - DoubleConversion + - glog + - hermes-engine + - JWTDecode (~> 3.0.0) + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SwiftyRSA (~> 1.7) + - Yoga - CodePush (9.0.0): - Base64 (~> 1.1) - JWT (~> 3.0.0-beta.12) @@ -169,6 +192,7 @@ PODS: - hermes-engine/Pre-built (0.75.3) - JWT (3.0.0-beta.14): - Base64 (~> 1.1.2) + - JWTDecode (3.0.1) - libwebp (1.3.2): - libwebp/demux (= 1.3.2) - libwebp/mux (= 1.3.2) @@ -1738,6 +1762,8 @@ PODS: - React-logger (= 0.75.3) - React-perflogger (= 0.75.3) - React-utils (= 0.75.3) + - ReactNativePerformance (4.1.2): + - React-Core - RNAppleAuthentication (2.4.0): - React-Core - RNBootSplash (6.2.6): @@ -1941,10 +1967,14 @@ PODS: - SDWebImage/Core (~> 5.10) - SocketRocket (0.7.0) - SSZipArchive (2.5.5) + - SwiftyRSA (1.7.0): + - SwiftyRSA/ObjC (= 1.7.0) + - SwiftyRSA/ObjC (1.7.0) - Yoga (0.0.0) DEPENDENCIES: - boost (from `../../../node_modules/react-native/third-party-podspecs/boost.podspec`) + - "callstack-repack (from `../../../node_modules/@callstack/repack`)" - CodePush (from `../../../node_modules/react-native-code-push`) - DoubleConversion (from `../../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../../../node_modules/react-native/Libraries/FBLazyVector`) @@ -2019,6 +2049,7 @@ DEPENDENCIES: - React-utils (from `../../../node_modules/react-native/ReactCommon/react/utils`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../../../node_modules/react-native/ReactCommon`) + - "ReactNativePerformance (from `../../../node_modules/@shopify/react-native-performance`)" - "RNAppleAuthentication (from `../../../node_modules/@invertase/react-native-apple-authentication`)" - RNBootSplash (from `../../../node_modules/react-native-bootsplash`) - "RNCClipboard (from `../../../node_modules/@react-native-clipboard/clipboard`)" @@ -2063,6 +2094,7 @@ SPEC REPOS: - GTMAppAuth - GTMSessionFetcher - JWT + - JWTDecode - libwebp - MMKV - MMKVCore @@ -2073,10 +2105,13 @@ SPEC REPOS: - SDWebImageWebPCoder - SocketRocket - SSZipArchive + - SwiftyRSA EXTERNAL SOURCES: boost: :podspec: "../../../node_modules/react-native/third-party-podspecs/boost.podspec" + callstack-repack: + :path: "../../../node_modules/@callstack/repack" CodePush: :path: "../../../node_modules/react-native-code-push" DoubleConversion: @@ -2214,6 +2249,8 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../../../node_modules/react-native/ReactCommon" + ReactNativePerformance: + :path: "../../../node_modules/@shopify/react-native-performance" RNAppleAuthentication: :path: "../../../node_modules/@invertase/react-native-apple-authentication" RNBootSplash: @@ -2259,6 +2296,7 @@ SPEC CHECKSUMS: AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa Base64: cecfb41a004124895a7bcee567a89bae5a89d49b boost: 4cb898d0bf20404aab1850c656dcea009429d6c1 + callstack-repack: bcb221c6d821b62cc0e2e0dd20278fad09a15e37 CodePush: ea174f879b85dff65380bee54243bbe523ea16b2 DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 FBLazyVector: 7b438dceb9f904bd85ca3c31d64cce32a035472b @@ -2284,6 +2322,7 @@ SPEC CHECKSUMS: GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2 hermes-engine: 8d2103d6c0176779aea4e25df6bb1410f9946680 JWT: ef71dfb03e1f842081e64dc42eef0e164f35d251 + JWTDecode: 2eed97c2fa46ccaf3049a787004eedf0be474a87 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 MMKV: f7d1d5945c8765f97f39c3d121f353d46735d801 MMKVCore: c04b296010fcb1d1638f2c69405096aac12f6390 @@ -2352,6 +2391,7 @@ SPEC CHECKSUMS: React-utils: 211020f1a54caa72455ccf55853b064e590f564b ReactCodegen: c553d76baaa1d2ded9f5145a3e5cdd4b3467798b ReactCommon: d5e70af52fb05bd546fd7f002c549f57116c59e4 + ReactNativePerformance: ab7dee4c4862623d72c1530a9fc71b55458edf71 RNAppleAuthentication: e00c76acb03351f5544373c78fa7f359bef6d5d3 RNBootSplash: 107e51392c11c000af0fdcbd90336203068e5e5e RNCClipboard: 69ab8e51324d5b351f6ba72bbdb72478087a2c64 @@ -2375,6 +2415,7 @@ SPEC CHECKSUMS: SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d SSZipArchive: c69881e8ac5521f0e622291387add5f60f30f3c4 + SwiftyRSA: 8c6dd1ea7db1b8dc4fb517a202f88bb1354bc2c6 Yoga: 33604ac44957ebe3f30f15b4cd0a3f96634e624a PODFILE CHECKSUM: 251d16daf60694f87f9e77bbffc7e5631eee0d39 diff --git a/apps/billets-app/package.json b/apps/billets-app/package.json index 3dae79f6..c5b318d0 100644 --- a/apps/billets-app/package.json +++ b/apps/billets-app/package.json @@ -1,6 +1,6 @@ { "name": "@coldsurfers/billets-app", - "version": "1.6.7", + "version": "1.6.8", "private": true, "scripts": { "android": "react-native run-android", @@ -50,6 +50,7 @@ "@react-navigation/bottom-tabs": "^6.5.11", "@react-navigation/native": "^6.1.9", "@react-navigation/native-stack": "^6.9.17", + "@shopify/react-native-performance": "^4.1.2", "@tanstack/react-query": "*", "@uidotdev/usehooks": "^2.4.1", "date-fns": "^2.29.3", @@ -88,10 +89,14 @@ "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", + "@callstack/repack": "5.0.0-rc.10", + "@callstack/repack-plugin-reanimated": "5.0.0-rc.6", "@react-native/babel-preset": "0.75.3", "@react-native/eslint-config": "0.75.3", "@react-native/metro-config": "0.75.3", "@react-native/typescript-config": "0.75.3", + "@rspack/core": "^1.2.2", + "@swc/helpers": "^0.5.15", "@tanstack/eslint-plugin-query": "^5.58.1", "@types/lodash.uniqby": "^4", "@types/ngeohash": "*", @@ -102,6 +107,7 @@ "@typescript-eslint/parser": "^5.29.0", "babel-jest": "^29.6.3", "babel-plugin-module-resolver": "^5.0.2", + "babel-plugin-syntax-hermes-parser": "^0.26.0", "detox": "^19.8.1", "eslint": "8.57.0", "eslint-config-prettier": "^9.1.0", diff --git a/apps/billets-app/react-native.config.js b/apps/billets-app/react-native.config.js index ff396767..276eead8 100644 --- a/apps/billets-app/react-native.config.js +++ b/apps/billets-app/react-native.config.js @@ -4,4 +4,5 @@ module.exports = { android: {}, }, assets: ['./assets/fonts/'], + commands: require('@callstack/repack/commands/rspack'), } diff --git a/apps/billets-app/rspack.config.mjs b/apps/billets-app/rspack.config.mjs new file mode 100644 index 00000000..2fb9bb4f --- /dev/null +++ b/apps/billets-app/rspack.config.mjs @@ -0,0 +1,124 @@ +// https://github.com/callstack/repack/blob/2390ead8ae0da12f7af59422b4de6b6162acf635/apps/tester-federation-v2/rspack.config.host-app.mjs +// @ts-check +import * as Repack from '@callstack/repack' +import { ReanimatedPlugin } from '@callstack/repack-plugin-reanimated' +import rspack from '@rspack/core' +import path from 'node:path' + +const dirname = Repack.getDirname(import.meta.url) + +/** @type {(env: import('@callstack/repack').EnvOptions) => import('@rspack/core').Configuration} */ +export default (env) => { + const { + mode = 'development', + context = dirname, + entry = './index.js', + platform = process.env.PLATFORM, + minimize = mode === 'production', + devServer = undefined, + bundleFilename = undefined, + sourceMapFilename = undefined, + assetsPath = undefined, + } = env + + if (!platform) { + throw new Error('Missing platform') + } + + process.env.BABEL_ENV = mode + + return { + mode, + devtool: false, + context, + entry, + resolve: { + ...Repack.getResolveOptions(platform), + alias: { + 'react': new URL('../../node_modules/react', import.meta.url).pathname, + '@coldsurfers/ocean-road/native': new URL('../../packages/ocean-road/src/native/index.ts', import.meta.url) + .pathname, + '@/screens': new URL('./src/screens', import.meta.url).pathname, + '@/navigations': new URL('./src/navigations', import.meta.url).pathname, + '@/lib': new URL('./src/lib', import.meta.url).pathname, + '@/ui': new URL('./src/ui', import.meta.url).pathname, + '@/features': new URL('./src/features', import.meta.url).pathname, + '@/types': new URL('./src/types', import.meta.url).pathname, + 'assets': new URL('./assets', import.meta.url).pathname, + }, + }, + output: { + clean: true, + hashFunction: 'xxhash64', + path: path.join(dirname, 'build', 'host-app', platform), + filename: 'index.bundle', + chunkFilename: '[name].chunk.bundle', + publicPath: Repack.getPublicPath({ platform, devServer }), + uniqueName: 'BilletsApp', + }, + optimization: { + minimize, + chunkIds: 'named', + }, + module: { + rules: [ + Repack.REACT_NATIVE_LOADING_RULES, + Repack.NODE_MODULES_LOADING_RULES, + Repack.FLOW_TYPED_MODULES_LOADING_RULES, + { + test: /\.[jt]sx?$/, + type: 'javascript/auto', + exclude: [/node_modules/], + use: { + loader: 'builtin:swc-loader', + options: { + env: { + targets: { 'react-native': '0.75.3' }, + }, + jsc: { + assumptions: { + setPublicClassFields: true, + privateFieldsAsProperties: true, + }, + externalHelpers: true, + transform: { + react: { + runtime: 'automatic', + }, + }, + }, + }, + }, + }, + { + test: Repack.getAssetExtensionsRegExp(Repack.ASSET_EXTENSIONS), + use: { + loader: '@callstack/repack/assets-loader', + options: { + platform, + devServerEnabled: Boolean(devServer), + }, + }, + }, + ], + }, + plugins: [ + new Repack.RepackPlugin({ + context, + mode, + platform, + devServer, + output: { + bundleFilename, + sourceMapFilename, + assetsPath, + }, + }), + // silence missing @react-native-masked-view optionally required by @react-navigation/elements + new rspack.IgnorePlugin({ + resourceRegExp: /^@react-native-masked-view/, + }), + new ReanimatedPlugin(), + ], + } +} diff --git a/apps/billets-app/src/features/concert-detail/ui/concert-detail-section-list-item/concert-detail-section-list-item.tsx b/apps/billets-app/src/features/concert-detail/ui/concert-detail-section-list-item/concert-detail-section-list-item.tsx index 0ff1b583..7fd50403 100644 --- a/apps/billets-app/src/features/concert-detail/ui/concert-detail-section-list-item/concert-detail-section-list-item.tsx +++ b/apps/billets-app/src/features/concert-detail/ui/concert-detail-section-list-item/concert-detail-section-list-item.tsx @@ -34,7 +34,15 @@ ConcertDetailSectionListItem.DateItem = ({ date, isKOPIS }: ConcertDetailSection {format(new Date(date ?? ''), 'MMM dd, hh:mm a')} {isKOPIS ? ( - + {KOPIS_COPYRIGHT_TEXT} ) : null} @@ -277,6 +285,5 @@ const styles = StyleSheet.create({ fontSize: 12, paddingHorizontal: 12, marginVertical: 8, - color: colors.oc.gray[3].value, }, }) diff --git a/apps/billets-app/src/lib/api/openapi-client.ts b/apps/billets-app/src/lib/api/openapi-client.ts index 7fc24a99..bc58a80c 100644 --- a/apps/billets-app/src/lib/api/openapi-client.ts +++ b/apps/billets-app/src/lib/api/openapi-client.ts @@ -183,9 +183,24 @@ export const apiClient = { 'event', { offset, size }, ], + artistList: ({ offset, size }: { offset?: number; size?: number }) => [ + 'v1', + 'subscribe', + 'list', + 'artist', + { offset, size }, + ], + venueList: ({ offset, size }: { offset?: number; size?: number }) => [ + 'v1', + 'subscribe', + 'list', + 'venue', + { offset, size }, + ], eventSubscribe: ({ eventId }: { eventId: string }) => ['v1', 'subscribe', 'event', { eventId }], artistSubscribe: ({ artistId }: { artistId: string }) => ['v1', 'subscribe', 'artist', { artistId }], venueSubscribe: ({ venueId }: { venueId: string }) => ['v1', 'subscribe', 'venue', { venueId }], + infoMe: ['v1', 'subscribe', 'me'], }, getEventList: async (params: { offset: number; size: number }) => { const data = await fetchClient.GET('/v1/subscribe/event', { @@ -198,6 +213,28 @@ export const apiClient = { } return data.data }, + getArtistList: async (params: { offset: number; size: number }) => { + const data = await fetchClient.GET('/v1/subscribe/artist', { + params: { + query: params, + }, + }) + if (data.error) { + throw new OpenApiError(data.error) + } + return data.data + }, + getVenueList: async (params: { offset: number; size: number }) => { + const data = await fetchClient.GET('/v1/subscribe/venue', { + params: { + query: params, + }, + }) + if (data.error) { + throw new OpenApiError(data.error) + } + return data.data + }, getEvent: async ({ eventId }: { eventId: string }) => { const data = await fetchClient.GET('/v1/subscribe/event/{eventId}', { params: { @@ -303,6 +340,13 @@ export const apiClient = { } return data.data }, + getInfoMe: async () => { + const data = await fetchClient.GET('/v1/subscribe/me') + if (data.error) { + throw new OpenApiError(data.error) + } + return data.data + }, }, ticket: { queryKeys: { @@ -351,13 +395,15 @@ export const apiClient = { offset, size, locationCityId, + eventCategoryName, }: { latitude?: number longitude?: number locationCityId?: string offset?: number size?: number - }) => ['v1', 'event', ' list', { latitude, longitude, offset, size, locationCityId }], + eventCategoryName?: string + }) => ['v1', 'event', ' list', { latitude, longitude, offset, size, locationCityId, eventCategoryName }], detail: ({ eventId }: { eventId: string }) => ['v1', 'event', 'detail', { eventId }], }, getList: async ({ @@ -366,12 +412,14 @@ export const apiClient = { offset, size, locationCityId, + eventCategoryName, }: { latitude?: number longitude?: number offset: number size: number locationCityId?: string + eventCategoryName?: string }) => { const data = await fetchClient.GET('/v1/event/', { params: { @@ -381,6 +429,7 @@ export const apiClient = { offset, size, locationCityId, + eventCategoryName, }, }, }) @@ -403,6 +452,19 @@ export const apiClient = { return data.data }, }, + eventCategory: { + queryKeys: { + all: ['event-category'], + list: ['event-category', 'list'], + }, + getEventCategories: async () => { + const response = await fetchClient.GET('/v1/event-category/') + if (response.error) { + throw new OpenApiError(response.error) + } + return response.data + }, + }, location: { queryKeys: { country: { @@ -418,4 +480,23 @@ export const apiClient = { return response.data }, }, + search: { + queryKeys: { + all: ['v1', 'search'], + list: (keyword: string) => ['v1', 'search', { keyword }], + }, + getSearchResult: async (keyword: string) => { + const response = await fetchClient.GET('/v1/search/', { + params: { + query: { + keyword, + }, + }, + }) + if (response.error) { + throw new OpenApiError(response.error) + } + return response.data + }, + }, } diff --git a/apps/billets-app/src/lib/navigations/constants.ts b/apps/billets-app/src/lib/navigations/constants.ts index 55ab166f..c2357b89 100644 --- a/apps/billets-app/src/lib/navigations/constants.ts +++ b/apps/billets-app/src/lib/navigations/constants.ts @@ -103,6 +103,14 @@ export const zodScreen = createZodScreen({ name: 'SubscribedConcertListScreen', params: z.object({}), }, + SubscribedArtistListScreen: { + name: 'SubscribedArtistListScreen', + params: z.object({}), + }, + SubscribedVenueListScreen: { + name: 'SubscribedVenueListScreen', + params: z.object({}), + }, VenueDetailScreen: { name: 'VenueDetailScreen', params: z.object({ @@ -125,4 +133,10 @@ export const zodScreen = createZodScreen({ name: 'SettingsScreen', params: z.object({}), }, + EventCategoryScreen: { + name: 'EventCategoryScreen', + params: z.object({ + eventCategory: z.string(), + }), + }, } as const) diff --git a/apps/billets-app/src/lib/utils.event-category.ts b/apps/billets-app/src/lib/utils.event-category.ts new file mode 100644 index 00000000..7c9aab8d --- /dev/null +++ b/apps/billets-app/src/lib/utils.event-category.ts @@ -0,0 +1,13 @@ +// @TODO: same name with billets-web +export const getEventCategoryUIName = (originalName: string) => { + switch (originalName) { + case 'Gigs': + return '콘서트' + case 'Theatre': + return '연극 / 뮤지컬' + case 'Dance': + return '무용' + default: + return originalName + } +} diff --git a/apps/billets-app/src/navigations/event-stack-navigation/event-stack-navigation.tsx b/apps/billets-app/src/navigations/event-stack-navigation/event-stack-navigation.tsx index 698d5d94..68ae9f2e 100644 --- a/apps/billets-app/src/navigations/event-stack-navigation/event-stack-navigation.tsx +++ b/apps/billets-app/src/navigations/event-stack-navigation/event-stack-navigation.tsx @@ -1,7 +1,11 @@ +import { zodScreen } from '@/lib' +import { getEventCategoryUIName } from '@/lib/utils.event-category' import { ConcertTicketListScreen, EventDetailScreen } from '@/screens' +import { EventCategoryScreen } from '@/screens/event-category-screen' import { NavigationHeader } from '@/ui' import { createNativeStackNavigator } from '@react-navigation/native-stack' import React from 'react' +import { z } from 'zod' import { EventStackParamList } from './event-stack-navigation.types' const Stack = createNativeStackNavigator() @@ -47,6 +51,26 @@ export const EventStackNavigation = () => { ), }} /> + ( + )['eventCategory'], + ), + }} + /> + ), + }} + /> ) } diff --git a/apps/billets-app/src/navigations/event-stack-navigation/event-stack-navigation.types.ts b/apps/billets-app/src/navigations/event-stack-navigation/event-stack-navigation.types.ts index d09d312c..a02fea7b 100644 --- a/apps/billets-app/src/navigations/event-stack-navigation/event-stack-navigation.types.ts +++ b/apps/billets-app/src/navigations/event-stack-navigation/event-stack-navigation.types.ts @@ -1,5 +1,6 @@ import { zodNavigation, ZodNavigationParamList, ZodNavigationParams, zodScreen } from '@/lib' import { ConcertTicketListScreenParams, EventDetailScreenParams } from '@/screens' +import { EventCategoryScreenParams } from '@/screens/event-category-screen' import { CompositeScreenProps } from '@react-navigation/native' import { NativeStackScreenProps } from '@react-navigation/native-stack' import { MainStackScreenProps } from '../main-stack-navigation' @@ -9,6 +10,7 @@ export type EventStackParams = ZodNavigationParams export type EventStackScreenProps = CompositeScreenProps< diff --git a/apps/billets-app/src/navigations/subscribed-stack-navigation/subscribed-stack-navigation.tsx b/apps/billets-app/src/navigations/subscribed-stack-navigation/subscribed-stack-navigation.tsx index 2ab575e5..a67c419c 100644 --- a/apps/billets-app/src/navigations/subscribed-stack-navigation/subscribed-stack-navigation.tsx +++ b/apps/billets-app/src/navigations/subscribed-stack-navigation/subscribed-stack-navigation.tsx @@ -1,4 +1,6 @@ import { SubscribedConcertListScreen } from '@/screens' +import { SubscribedArtistListScreen } from '@/screens/subscribed-artist-list-screen' +import { SubscribedVenueListScreen } from '@/screens/subscribed-venue-list-screen' import { NavigationHeader } from '@/ui' import { createNativeStackNavigator } from '@react-navigation/native-stack' import { SubscribedStackParamList } from './subscribed-stack-navigation.types' @@ -19,7 +21,7 @@ export const SubscribedStackNavigation = () => { {...props} options={{ ...props.options, - title: '찜한공연', + title: '공연', }} /> ), @@ -27,6 +29,36 @@ export const SubscribedStackNavigation = () => { name="SubscribedConcertListScreen" component={SubscribedConcertListScreen} /> + ( + + ), + }} + name="SubscribedArtistListScreen" + component={SubscribedArtistListScreen} + /> + ( + + ), + }} + name="SubscribedVenueListScreen" + component={SubscribedVenueListScreen} + /> ) } diff --git a/apps/billets-app/src/navigations/subscribed-stack-navigation/subscribed-stack-navigation.types.ts b/apps/billets-app/src/navigations/subscribed-stack-navigation/subscribed-stack-navigation.types.ts index 3e55cd62..d30eea85 100644 --- a/apps/billets-app/src/navigations/subscribed-stack-navigation/subscribed-stack-navigation.types.ts +++ b/apps/billets-app/src/navigations/subscribed-stack-navigation/subscribed-stack-navigation.types.ts @@ -1,5 +1,7 @@ import { ZodNavigationParamList, ZodNavigationParams } from '@/lib' import { SubscribedConcertListScreenParams } from '@/screens' +import { SubscribedArtistListScreenParams } from '@/screens/subscribed-artist-list-screen' +import { SubscribedVenueListScreenParams } from '@/screens/subscribed-venue-list-screen' import { CompositeScreenProps } from '@react-navigation/native' import { NativeStackScreenProps } from '@react-navigation/native-stack' import { zodNavigation, zodScreen } from '../../lib/navigations/constants' @@ -9,6 +11,8 @@ export type SubscribedStackParams = ZodNavigationParams export type SubscribedStackScreenProps = CompositeScreenProps< diff --git a/apps/billets-app/src/screens/email-login-screen/email-login-screen.tsx b/apps/billets-app/src/screens/email-login-screen/email-login-screen.tsx index 456a5c03..3d85f194 100644 --- a/apps/billets-app/src/screens/email-login-screen/email-login-screen.tsx +++ b/apps/billets-app/src/screens/email-login-screen/email-login-screen.tsx @@ -1,13 +1,13 @@ import { AuthContext, ToastVisibleContext, ToastVisibleContextProvider } from '@/lib' import { $api } from '@/lib/api/openapi-client' -import { CommonScreenLayout, NAVIGATION_HEADER_HEIGHT } from '@/ui' -import { Button, Spinner, TextInput, useColorScheme } from '@coldsurfers/ocean-road/native' +import { CommonScreenLayout } from '@/ui' +import { NAVIGATION_HEADER_HEIGHT } from '@/ui/navigation-header/navigation-header.constants' +import { Button, Spinner, TextInput } from '@coldsurfers/ocean-road/native' import React, { useCallback, useContext, useEffect, useState } from 'react' import { KeyboardAvoidingView, StyleSheet, View } from 'react-native' import { useEmailLoginScreenNavigation } from './email-login-screen.hooks' const _EmailLoginScreen = () => { - const { semantics } = useColorScheme() const { show } = useContext(ToastVisibleContext) const { login } = useContext(AuthContext) const { navigate } = useEmailLoginScreenNavigation() diff --git a/apps/billets-app/src/screens/event-category-screen/event-category-screen.hooks.ts b/apps/billets-app/src/screens/event-category-screen/event-category-screen.hooks.ts new file mode 100644 index 00000000..444788a5 --- /dev/null +++ b/apps/billets-app/src/screens/event-category-screen/event-category-screen.hooks.ts @@ -0,0 +1,5 @@ +import { EventCategoryScreenProps } from '@/screens/event-category-screen' +import { useNavigation, useRoute } from '@react-navigation/native' + +export const useEventCategoryScreenNavigation = () => useNavigation() +export const useEventCategoryScreenRoute = () => useRoute() diff --git a/apps/billets-app/src/screens/event-category-screen/event-category-screen.tsx b/apps/billets-app/src/screens/event-category-screen/event-category-screen.tsx new file mode 100644 index 00000000..10687dfa --- /dev/null +++ b/apps/billets-app/src/screens/event-category-screen/event-category-screen.tsx @@ -0,0 +1,37 @@ +import { zodScreen } from '@/lib/navigations' +import { CommonScreenLayout, ConcertList } from '@/ui' +import { Spinner } from '@coldsurfers/ocean-road/native' +import { PerformanceMeasureView, useStartProfiler } from '@shopify/react-native-performance' +import { Suspense, useCallback } from 'react' +import { useEventCategoryScreenNavigation, useEventCategoryScreenRoute } from './event-category-screen.hooks' + +export const EventCategoryScreen = () => { + const startNavigationTTITimer = useStartProfiler() + const route = useEventCategoryScreenRoute() + const navigation = useEventCategoryScreenNavigation() + const onPressItem = useCallback( + (eventId: string) => { + startNavigationTTITimer({ + source: zodScreen.EventCategoryScreen.name, + uiEvent: undefined, + }) + navigation.navigate('EventDetailScreen', { + eventId, + }) + }, + [navigation, startNavigationTTITimer], + ) + return ( + + + }> + onPressItem(item.id)} + /> + + + + ) +} diff --git a/apps/billets-app/src/screens/event-category-screen/event-category-screen.types.ts b/apps/billets-app/src/screens/event-category-screen/event-category-screen.types.ts new file mode 100644 index 00000000..39bdbaa2 --- /dev/null +++ b/apps/billets-app/src/screens/event-category-screen/event-category-screen.types.ts @@ -0,0 +1,5 @@ +import { zodScreen, ZodScreenParams } from '@/lib/navigations' +import { EventStackScreenProps } from '@/navigations/event-stack-navigation' + +export type EventCategoryScreenParams = ZodScreenParams +export type EventCategoryScreenProps = EventStackScreenProps diff --git a/apps/billets-app/src/screens/event-category-screen/index.ts b/apps/billets-app/src/screens/event-category-screen/index.ts new file mode 100644 index 00000000..651f9467 --- /dev/null +++ b/apps/billets-app/src/screens/event-category-screen/index.ts @@ -0,0 +1,3 @@ +export * from './event-category-screen' +export * from './event-category-screen.hooks' +export * from './event-category-screen.types' diff --git a/apps/billets-app/src/screens/event-detail-screen/event-detail-screen.tsx b/apps/billets-app/src/screens/event-detail-screen/event-detail-screen.tsx index 5d4ce136..2306a915 100644 --- a/apps/billets-app/src/screens/event-detail-screen/event-detail-screen.tsx +++ b/apps/billets-app/src/screens/event-detail-screen/event-detail-screen.tsx @@ -4,7 +4,7 @@ import { ConcertDetailVenueMapBottomSheet, } from '@/features/concert-detail' import { useToggleSubscribeConcert } from '@/features/subscribe' -import { useEffectOnce, useStoreReview } from '@/lib' +import { useEffectOnce, useStoreReview, zodScreen } from '@/lib' import { apiClient } from '@/lib/api/openapi-client' import commonStyles from '@/lib/common-styles' import { concertDetailCountForStoreReviewStorage } from '@/lib/storage' @@ -13,6 +13,7 @@ import { TicketListBottomSheet } from '@/ui/ticket-list-bottom-sheet/ticket-list import { colors } from '@coldsurfers/ocean-road' import { Spinner, useColorScheme } from '@coldsurfers/ocean-road/native' import { BottomSheetModal } from '@gorhom/bottom-sheet' +import { PerformanceMeasureView } from '@shopify/react-native-performance' import { useQuery, useSuspenseQuery } from '@tanstack/react-query' import React, { PropsWithChildren, Suspense, useCallback, useMemo, useRef } from 'react' import { Dimensions, Platform, StatusBar, StyleSheet, View } from 'react-native' @@ -228,15 +229,17 @@ const ScreenInner = () => { export const EventDetailScreen = () => { return ( - - - - } - > - - + + + + + } + > + + + ) } diff --git a/apps/billets-app/src/screens/home-screen/home-screen.tsx b/apps/billets-app/src/screens/home-screen/home-screen.tsx index b38e6ad2..2b6788df 100644 --- a/apps/billets-app/src/screens/home-screen/home-screen.tsx +++ b/apps/billets-app/src/screens/home-screen/home-screen.tsx @@ -1,5 +1,5 @@ import { CurrentLocationTracker, useToggleSubscribeConcert, useUserCurrentLocationStore } from '@/features' -import { useShowBottomTabBar } from '@/lib' +import { useShowBottomTabBar, zodScreen } from '@/lib' import { apiClient } from '@/lib/api/openapi-client' import { AnimatePresence, @@ -11,13 +11,15 @@ import { } from '@/ui' import { ConcertListItemType } from '@/ui/concert-list/concert-list.types' import { useScrollToTop } from '@react-navigation/native' +import { PerformanceMeasureView, RenderStateProps, useStartProfiler } from '@shopify/react-native-performance' import { useQuery } from '@tanstack/react-query' import { Suspense, useCallback, useRef, useState } from 'react' -import { FlatList } from 'react-native' +import { FlatList, StyleSheet, View } from 'react-native' import { useShallow } from 'zustand/shallow' import { useHomeScreenNavigation } from './home-screen.hooks' const SuspenseHomeScreen = () => { + const startNavigationTTITimer = useStartProfiler() const navigation = useHomeScreenNavigation() const listRef = useRef(null) useScrollToTop(listRef) @@ -47,12 +49,16 @@ const SuspenseHomeScreen = () => { const onPressConcertListItem = useCallback( (item: ConcertListItemType) => { + startNavigationTTITimer({ + source: zodScreen.HomeScreen.name, + uiEvent: undefined, + }) navigation.navigate('EventStackNavigation', { screen: 'EventDetailScreen', params: { eventId: item.id }, }) }, - [navigation], + [navigation, startNavigationTTITimer], ) const onPressSubscribeConcertListItem = useCallback( @@ -95,6 +101,7 @@ const SuspenseHomeScreen = () => { {latitude === null && longitude === null && } + {latitude !== null && longitude !== null && ( }> @@ -113,9 +120,30 @@ const SuspenseHomeScreen = () => { } export const HomeScreen = () => { + const renderStateProps: RenderStateProps = { + interactive: false, + renderPassName: 'home_screen_render', + } return ( - }> - - + } + > + }> + + + ) } + +const styles = StyleSheet.create({ + contentContainer: { + paddingHorizontal: 12, + paddingBottom: 64, + flexGrow: 1, + }, + list: { flex: 1 }, +}) diff --git a/apps/billets-app/src/screens/my-screen/my-screen.tsx b/apps/billets-app/src/screens/my-screen/my-screen.tsx index afa88c13..aa0e1fc0 100644 --- a/apps/billets-app/src/screens/my-screen/my-screen.tsx +++ b/apps/billets-app/src/screens/my-screen/my-screen.tsx @@ -1,9 +1,10 @@ import { useShowBottomTabBar } from '@/lib' import { apiClient } from '@/lib/api/openapi-client' -import { CommonScreenLayout, MyScreenLandingLayout, SubscribedConcertList, SubscribedConcertListSkeleton } from '@/ui' +import { CommonScreenLayout, MyScreenLandingLayout, SubscribedConcertListSkeleton, SubscribeInfoMe } from '@/ui' import { colors } from '@coldsurfers/ocean-road' import { Button, ProfileThumbnail, Spinner, Text, useColorScheme } from '@coldsurfers/ocean-road/native' import { useQuery } from '@tanstack/react-query' +import { CircleUserRound, Star } from 'lucide-react-native' import React, { Suspense, useCallback, useMemo } from 'react' import { Pressable, SectionList, SectionListRenderItem, StyleSheet, View } from 'react-native' import { match } from 'ts-pattern' @@ -20,6 +21,7 @@ const SuspenseMyScreen = () => { queryKey: apiClient.user.queryKeys.me, queryFn: () => apiClient.user.getMe(), }) + const { semantics } = useColorScheme() useShowBottomTabBar() @@ -30,20 +32,21 @@ const SuspenseMyScreen = () => { params: {}, }) }, [navigation]) - const onPressSubscribedConcertListItem = useCallback( - (eventId: string) => { - navigation.navigate('EventStackNavigation', { - screen: 'EventDetailScreen', - params: { eventId }, - }) - }, - [navigation], - ) const renderSectionHeader = useCallback( (info: { section: MyScreenSettingSectionListSectionT }) => { return ( + + {match(info.section.title) + .with('profile', () => { + return + }) + .with('saved', () => { + return + }) + .otherwise(() => null)} + {info.section.uiTitle} {info.section.moreAddOn && ( @@ -89,13 +92,13 @@ const SuspenseMyScreen = () => { .with('saved', () => { return ( }> - + ) }) .exhaustive() }, - [onPressSubscribedConcertListItem, semantics.foreground], + [semantics.foreground], ) const sections = useMemo(() => { @@ -105,25 +108,16 @@ const SuspenseMyScreen = () => { return [ { title: 'profile', - uiTitle: '🙂 마이 프로필', + uiTitle: '마이 프로필', data: [{ title: user.email.split('@')[0], onPress: () => {} }], }, { title: 'saved', - uiTitle: '❣️ 찜한 공연', - moreAddOn: { - uiText: '더 보기', - onPress: () => { - navigation.navigate('SubscribedStackNavigation', { - screen: 'SubscribedConcertListScreen', - params: {}, - }) - }, - }, + uiTitle: 'Following', data: [{ title: user.email.split('@')[0], onPress: () => {} }], }, ] - }, [navigation, user]) + }, [user]) return user ? ( diff --git a/apps/billets-app/src/screens/subscribed-artist-list-screen/index.ts b/apps/billets-app/src/screens/subscribed-artist-list-screen/index.ts new file mode 100644 index 00000000..b3272a96 --- /dev/null +++ b/apps/billets-app/src/screens/subscribed-artist-list-screen/index.ts @@ -0,0 +1,2 @@ +export * from './subscribed-artist-list-screen' +export * from './subscribed-artist-list-screen.types' diff --git a/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.hooks.tsx b/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.hooks.tsx new file mode 100644 index 00000000..ae50d4b2 --- /dev/null +++ b/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.hooks.tsx @@ -0,0 +1,6 @@ +import { useNavigation, useRoute } from '@react-navigation/native' +import { SubscribedArtistListScreenProps } from './subscribed-artist-list-screen.types' + +export const useSubscribedArtistListScreenNavigation = () => + useNavigation() +export const useSubscribedArtistListRoute = () => useRoute() diff --git a/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.tsx b/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.tsx new file mode 100644 index 00000000..2681e703 --- /dev/null +++ b/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.tsx @@ -0,0 +1,12 @@ +import { CommonScreenLayout } from '@/ui' +import { SubscribedArtistList } from '@/ui/subscribed-artist-list' +import { Spinner } from '@coldsurfers/ocean-road/native' +import { Suspense } from 'react' + +export const SubscribedArtistListScreen = () => ( + + }> + + + +) diff --git a/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.types.ts b/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.types.ts new file mode 100644 index 00000000..24500512 --- /dev/null +++ b/apps/billets-app/src/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.types.ts @@ -0,0 +1,7 @@ +import { zodScreen, ZodScreenParams } from '@/lib' +import { SubscribedStackScreenProps } from '@/navigations' + +export type SubscribedArtistListScreenParams = ZodScreenParams +export type SubscribedArtistListScreenProps = SubscribedStackScreenProps< + typeof zodScreen.SubscribedArtistListScreen.name +> diff --git a/apps/billets-app/src/screens/subscribed-concert-list-screen/subscribed-concert-list-screen.tsx b/apps/billets-app/src/screens/subscribed-concert-list-screen/subscribed-concert-list-screen.tsx index 2031fafe..1b81872d 100644 --- a/apps/billets-app/src/screens/subscribed-concert-list-screen/subscribed-concert-list-screen.tsx +++ b/apps/billets-app/src/screens/subscribed-concert-list-screen/subscribed-concert-list-screen.tsx @@ -17,7 +17,7 @@ const ScreenContent = () => { [navigation], ) return ( - + ) diff --git a/apps/billets-app/src/screens/subscribed-venue-list-screen/index.ts b/apps/billets-app/src/screens/subscribed-venue-list-screen/index.ts new file mode 100644 index 00000000..4403adcd --- /dev/null +++ b/apps/billets-app/src/screens/subscribed-venue-list-screen/index.ts @@ -0,0 +1,3 @@ +export * from './subscribed-venue-list-screen' +export * from './subscribed-venue-list-screen.hooks' +export * from './subscribed-venue-list-screen.types' diff --git a/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.hooks.tsx b/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.hooks.tsx new file mode 100644 index 00000000..2b954656 --- /dev/null +++ b/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.hooks.tsx @@ -0,0 +1,6 @@ +import { useNavigation, useRoute } from '@react-navigation/native' +import { SubscribedVenueListScreenProps } from './subscribed-venue-list-screen.types' + +export const useSubscribedVenueListScreenNavigation = () => + useNavigation() +export const useSubscribedVenueListRoute = () => useRoute() diff --git a/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.tsx b/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.tsx new file mode 100644 index 00000000..f7a55a5e --- /dev/null +++ b/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.tsx @@ -0,0 +1,12 @@ +import { CommonScreenLayout } from '@/ui' +import { SubscribedVenueList } from '@/ui/subscribed-venue-list' +import { Spinner } from '@coldsurfers/ocean-road/native' +import { Suspense } from 'react' + +export const SubscribedVenueListScreen = () => ( + + }> + + + +) diff --git a/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.types.ts b/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.types.ts new file mode 100644 index 00000000..33f56268 --- /dev/null +++ b/apps/billets-app/src/screens/subscribed-venue-list-screen/subscribed-venue-list-screen.types.ts @@ -0,0 +1,5 @@ +import { zodScreen, ZodScreenParams } from '@/lib' +import { SubscribedStackScreenProps } from '@/navigations' + +export type SubscribedVenueListScreenParams = ZodScreenParams +export type SubscribedVenueListScreenProps = SubscribedStackScreenProps diff --git a/apps/billets-app/src/screens/venue-detail-screen/venue-detail-screen.tsx b/apps/billets-app/src/screens/venue-detail-screen/venue-detail-screen.tsx index ddfe72ed..4a17e969 100644 --- a/apps/billets-app/src/screens/venue-detail-screen/venue-detail-screen.tsx +++ b/apps/billets-app/src/screens/venue-detail-screen/venue-detail-screen.tsx @@ -5,7 +5,7 @@ export const VenueDetailScreen = () => { const navigation = useVenueDetailScreenNavigation() const route = useVenueDetailScreenRoute() return ( - + { diff --git a/apps/billets-app/src/types/api.d.ts b/apps/billets-app/src/types/api.d.ts index 35f77ff9..2a6ec592 100644 --- a/apps/billets-app/src/types/api.d.ts +++ b/apps/billets-app/src/types/api.d.ts @@ -431,6 +431,50 @@ export interface paths { patch?: never trace?: never } + '/v1/event-category/': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Default Response */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['EventCategoryDTOSchema'][] + } + } + /** @description Default Response */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ErrorResponseDTOSchema'] + } + } + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } '/v1/event/': { parameters: { query?: never @@ -441,8 +485,10 @@ export interface paths { get: { parameters: { query?: { + eventCategoryName?: string latitude?: number locationCityId?: string + locationCityName?: string longitude?: number offset?: number size?: number @@ -1068,7 +1114,47 @@ export interface paths { path?: never cookie?: never } - get?: never + get: { + parameters: { + query?: { + offset?: number + size?: number + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Default Response */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ArtistSubscribeDTOSchema'][] + } + } + /** @description Default Response */ + 401: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ErrorResponseDTOSchema'] + } + } + /** @description Default Response */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ErrorResponseDTOSchema'] + } + } + } + } put?: never post: { parameters: { @@ -1471,6 +1557,59 @@ export interface paths { patch?: never trace?: never } + '/v1/subscribe/me': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Default Response */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['SubscribeInfoMeDTOSchema'] + } + } + /** @description Default Response */ + 401: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ErrorResponseDTOSchema'] + } + } + /** @description Default Response */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ErrorResponseDTOSchema'] + } + } + } + } + put?: never + post?: never + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } '/v1/subscribe/venue': { parameters: { query?: never @@ -1478,7 +1617,47 @@ export interface paths { path?: never cookie?: never } - get?: never + get: { + parameters: { + query?: { + offset?: number + size?: number + } + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description Default Response */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['VenueSubscribeDTOSchema'][] + } + } + /** @description Default Response */ + 401: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ErrorResponseDTOSchema'] + } + } + /** @description Default Response */ + 500: { + headers: { + [name: string]: unknown + } + content: { + 'application/json': components['schemas']['ErrorResponseDTOSchema'] + } + } + } + } put?: never post: { parameters: { @@ -1996,6 +2175,7 @@ export interface components { artistId: string /** Format: date-time */ subscribedAt: string + thumbUrl?: string /** Format: uuid */ userId: string } @@ -2064,6 +2244,10 @@ export interface components { | 'IMAGE_NOT_FOUND' message: string } + EventCategoryDTOSchema: { + id: string + name: string + } EventDetailDTOSchema: { data: { artists: components['schemas']['ArtistDTOSchema'][] @@ -2091,6 +2275,7 @@ export interface components { eventId: string /** Format: date-time */ subscribedAt: string + thumbUrl?: string /** Format: uuid */ userId: string } @@ -2150,6 +2335,20 @@ export interface components { SendEmailResponseDTOSchema: { success: boolean } + SubscribeInfoMeDTOSchema: { + artists: { + count: number + thumbUrl: string | null + } + events: { + count: number + thumbUrl: string | null + } + venues: { + count: number + thumbUrl: string | null + } + } TicketDTOSchema: { id: string /** Format: date-time */ @@ -2198,6 +2397,7 @@ export interface components { VenueSubscribeDTOSchema: { /** Format: date-time */ subscribedAt: string + thumbUrl?: string /** Format: uuid */ userId: string /** Format: uuid */ diff --git a/apps/billets-app/src/ui/common-screen-layout/common-screen-layout.tsx b/apps/billets-app/src/ui/common-screen-layout/common-screen-layout.tsx index 8105a9cb..2d6a053a 100644 --- a/apps/billets-app/src/ui/common-screen-layout/common-screen-layout.tsx +++ b/apps/billets-app/src/ui/common-screen-layout/common-screen-layout.tsx @@ -9,34 +9,34 @@ export const CommonScreenLayout = ({ children, style, edges = [], + withBottomTab = true, }: PropsWithChildren<{ edges?: Edges style?: StyleProp + withBottomTab?: boolean }>) => { const { semantics } = useColorScheme() const { bottom: bottomInset } = useSafeAreaInsets() const { tabBarHeight } = useBottomTab() return ( - }> - - {children} - - + + }>{children} + ) } diff --git a/apps/billets-app/src/ui/concert-list/concert-list.styles.ts b/apps/billets-app/src/ui/concert-list/concert-list.styles.ts index c3af4646..038b00c3 100644 --- a/apps/billets-app/src/ui/concert-list/concert-list.styles.ts +++ b/apps/billets-app/src/ui/concert-list/concert-list.styles.ts @@ -3,7 +3,6 @@ import { StyleSheet } from 'react-native' export const concertListStyles = StyleSheet.create({ concertListContentContainer: { paddingHorizontal: 12, - marginTop: 12, paddingBottom: 64, flexGrow: 1, }, diff --git a/apps/billets-app/src/ui/concert-list/concert-list.tsx b/apps/billets-app/src/ui/concert-list/concert-list.tsx index ae67b6d2..8ce0d8b3 100644 --- a/apps/billets-app/src/ui/concert-list/concert-list.tsx +++ b/apps/billets-app/src/ui/concert-list/concert-list.tsx @@ -1,133 +1,142 @@ import { useUserCurrentLocationStore } from '@/features' import { apiClient } from '@/lib/api/openapi-client' -import { colors } from '@coldsurfers/ocean-road' import { Spinner } from '@coldsurfers/ocean-road/native' import { useSuspenseInfiniteQuery } from '@tanstack/react-query' import { forwardRef, useCallback, useMemo, useState } from 'react' -import { FlatList, ListRenderItem, Platform, RefreshControl, View } from 'react-native' +import { FlatList, ListRenderItem, View } from 'react-native' import { match } from 'ts-pattern' import { useShallow } from 'zustand/shallow' import { CommonListEmpty } from '../common-list-empty' import { ConcertListItem } from '../concert-list-item' +import { EventCategoryList } from '../event-category-list' import { concertListStyles } from './concert-list.styles' import { ConcertListItemType } from './concert-list.types' type ConcertListProps = { onPressItem?: (item: ConcertListItemType) => void onPressSubscribe?: (item: ConcertListItemType, options: { isSubscribed: boolean }) => void + eventCategory?: string + hideTopMenu?: boolean } const PER_PAGE = 20 -export const ConcertList = forwardRef(({ onPressItem, onPressSubscribe }, ref) => { - const [isRefreshing, setIsRefreshing] = useState(false) - const { latitude, longitude, type, cityId } = useUserCurrentLocationStore( - useShallow((state) => ({ - latitude: state.latitude, - longitude: state.longitude, - type: state.type, - cityId: state.cityId, - })), - ) +export const ConcertList = forwardRef( + ({ onPressItem, onPressSubscribe, eventCategory, hideTopMenu }, ref) => { + const [isRefreshing, setIsRefreshing] = useState(false) + const { latitude, longitude, type, cityId } = useUserCurrentLocationStore( + useShallow((state) => ({ + latitude: state.latitude, + longitude: state.longitude, + type: state.type, + cityId: state.cityId, + })), + ) - const queryParams = useMemo(() => { - return match(type) - .with('current-location', () => ({ - latitude, - longitude, - })) - .with('city-location', () => ({ - locationCityId: cityId, - })) - .otherwise(() => ({})) - }, [type, latitude, longitude, cityId]) - - const { data, isPending, fetchNextPage, isFetchingNextPage, hasNextPage, refetch } = useSuspenseInfiniteQuery({ - initialPageParam: 0, - queryKey: apiClient.event.queryKeys.list(queryParams), - queryFn: ({ pageParam = 0 }) => - apiClient.event.getList({ - offset: pageParam, - size: PER_PAGE, - ...queryParams, - }), - getNextPageParam: (lastPage, allPages) => { - if (lastPage.length < PER_PAGE) { - return undefined + const queryParams = useMemo(() => { + const value: Parameters[0] = { + eventCategoryName: eventCategory, } - return allPages.length * PER_PAGE - }, - refetchOnWindowFocus: false, - }) - - const concertList = useMemo(() => { - return data.pages.flatMap((page) => page).map((data) => data.data) - }, [data?.pages]) - - const renderItem: ListRenderItem = useCallback( - ({ item, index }) => { - return ( - onPressItem?.(item)} - onPressSubscribe={({ isSubscribed }) => onPressSubscribe?.(item, { isSubscribed })} - style={{ - paddingLeft: index % 2 === 0 ? 0 : 6, - paddingRight: index % 2 === 0 ? 6 : 0, - }} - /> - ) - }, - [onPressItem, onPressSubscribe], - ) + return match(type) + .with('current-location', () => { + if (latitude === null || longitude === null) { + return value + } + value.latitude = latitude + value.longitude = longitude + return value + }) + .with('city-location', () => { + if (cityId === null) { + return value + } + value.locationCityId = cityId + return value + }) + .otherwise(() => value) + }, [eventCategory, type, latitude, longitude, cityId]) - const onEndReached = useCallback(async () => { - if (isPending || isFetchingNextPage) { - return - } - if (!hasNextPage) { - return - } - await fetchNextPage() - }, [fetchNextPage, hasNextPage, isFetchingNextPage, isPending]) + const { data, isPending, fetchNextPage, isFetchingNextPage, hasNextPage, refetch } = useSuspenseInfiniteQuery({ + initialPageParam: 0, + queryKey: apiClient.event.queryKeys.list(queryParams), + queryFn: ({ pageParam = 0 }) => + apiClient.event.getList({ + offset: pageParam, + size: PER_PAGE, + ...queryParams, + }), + getNextPageParam: (lastPage, allPages) => { + if (lastPage.length < PER_PAGE) { + return undefined + } + return allPages.length * PER_PAGE + }, + refetchOnWindowFocus: false, + }) - const onRefresh = useCallback(async () => { - setIsRefreshing(true) - await refetch() - setIsRefreshing(false) - }, [refetch]) + const concertList = useMemo(() => { + return data.pages.flatMap((page) => page).map((data) => data.data) + }, [data?.pages]) - return ( - item.id} - renderItem={renderItem} - // ItemSeparatorComponent={() => } - showsVerticalScrollIndicator={false} - contentContainerStyle={concertListStyles.concertListContentContainer} - ListEmptyComponent={ - isPending ? ( - - - - ) : ( - + const renderItem: ListRenderItem = useCallback( + ({ item, index }) => { + return ( + onPressItem?.(item)} + onPressSubscribe={({ isSubscribed }) => onPressSubscribe?.(item, { isSubscribed })} + style={{ + paddingLeft: index % 2 === 0 ? 0 : 6, + paddingRight: index % 2 === 0 ? 6 : 0, + }} + /> ) + }, + [onPressItem, onPressSubscribe], + ) + + const onEndReached = useCallback(async () => { + if (isPending || isFetchingNextPage) { + return } - ListFooterComponent={isFetchingNextPage ? : null} - refreshControl={ - + if (!hasNextPage) { + return } - scrollEnabled={!isRefreshing} - onEndReached={onEndReached} - /> - ) -}) + await fetchNextPage() + }, [fetchNextPage, hasNextPage, isFetchingNextPage, isPending]) + + const onRefresh = useCallback(async () => { + setIsRefreshing(true) + await refetch() + setIsRefreshing(false) + }, [refetch]) + + return ( + item.id} + renderItem={renderItem} + showsVerticalScrollIndicator={false} + contentContainerStyle={concertListStyles.concertListContentContainer} + ListEmptyComponent={ + isPending ? ( + + + + ) : ( + + ) + } + ListHeaderComponent={hideTopMenu ? null : } + refreshing={isRefreshing} + onRefresh={onRefresh} + ListFooterComponent={isFetchingNextPage ? : null} + scrollEnabled={!isRefreshing} + onEndReached={onEndReached} + /> + ) + }, +) diff --git a/apps/billets-app/src/ui/event-category-list/event-category-list.item.tsx b/apps/billets-app/src/ui/event-category-list/event-category-list.item.tsx new file mode 100644 index 00000000..305b5946 --- /dev/null +++ b/apps/billets-app/src/ui/event-category-list/event-category-list.item.tsx @@ -0,0 +1,61 @@ +import { zodScreen } from '@/lib/navigations' +import { getEventCategoryUIName } from '@/lib/utils.event-category' +import { useHomeScreenNavigation } from '@/screens' +import { components } from '@/types/api' +import { useColorScheme } from '@coldsurfers/ocean-road/native' +import { useStartProfiler } from '@shopify/react-native-performance' +import { memo, useCallback } from 'react' +import { + DanceIcon, + MicVocalIcon, + StyledEventCategoryButton, + StyledEventCategoryButtonText, + TheatreIcon, +} from './event-category-list.styled' + +// @TODO: same name with billets-web +const getUiIcon = (name: string) => { + // eslint-disable-next-line react-hooks/rules-of-hooks + const { semantics } = useColorScheme() + switch (name) { + case 'Gigs': + return + case 'Theatre': + return + case 'Dance': + return + default: + return '' + } +} + +export const EventCategoryListItem = memo((props: components['schemas']['EventCategoryDTOSchema']) => { + const startNavigationTTITimer = useStartProfiler() + const { semantics } = useColorScheme() + const navigation = useHomeScreenNavigation() + const onPress = useCallback(() => { + startNavigationTTITimer({ + source: zodScreen.HomeScreen.name, + uiEvent: undefined, + }) + navigation.navigate('EventStackNavigation', { + params: { + eventCategory: props.name, + }, + screen: 'EventCategoryScreen', + }) + }, [navigation, props.name, startNavigationTTITimer]) + return ( + + {getUiIcon(props.name)} + + {getEventCategoryUIName(props.name)} + + + ) +}) diff --git a/apps/billets-app/src/ui/event-category-list/event-category-list.styled.ts b/apps/billets-app/src/ui/event-category-list/event-category-list.styled.ts new file mode 100644 index 00000000..4eb23718 --- /dev/null +++ b/apps/billets-app/src/ui/event-category-list/event-category-list.styled.ts @@ -0,0 +1,22 @@ +import { Text } from '@coldsurfers/ocean-road/native' +import styled from '@emotion/native' +import { Disc3, MicVocal, VenetianMask } from 'lucide-react-native' + +export const StyledEventCategoryButton = styled.TouchableOpacity` + flex-direction: row; + align-items: center; + border-radius: 8px; + padding-vertical: 12px; + padding-horizontal: 12px; + margin-right: 8px; +` +export const StyledEventCategoryButtonText = styled(Text)` + margin-left: 4px; + font-size: 12px; +` + +export const MicVocalIcon = styled(MicVocal)`` + +export const TheatreIcon = styled(VenetianMask)`` + +export const DanceIcon = styled(Disc3)`` diff --git a/apps/billets-app/src/ui/event-category-list/event-category-list.tsx b/apps/billets-app/src/ui/event-category-list/event-category-list.tsx new file mode 100644 index 00000000..2f05b268 --- /dev/null +++ b/apps/billets-app/src/ui/event-category-list/event-category-list.tsx @@ -0,0 +1,22 @@ +import { apiClient } from '@/lib/api/openapi-client' +import { useQuery } from '@tanstack/react-query' +import { memo, useMemo } from 'react' +import { FlatList } from 'react-native' +import { EventCategoryListItem } from './event-category-list.item' + +export const EventCategoryList = memo(() => { + const { data: eventCategoriesData } = useQuery({ + queryKey: apiClient.eventCategory.queryKeys.list, + queryFn: () => apiClient.eventCategory.getEventCategories(), + }) + const data = useMemo(() => eventCategoriesData ?? [], [eventCategoriesData]) + return ( + } + keyExtractor={(item) => `${item.id}`} + style={{ marginBottom: 12 }} + /> + ) +}) diff --git a/apps/billets-app/src/ui/event-category-list/index.ts b/apps/billets-app/src/ui/event-category-list/index.ts new file mode 100644 index 00000000..832b6c53 --- /dev/null +++ b/apps/billets-app/src/ui/event-category-list/index.ts @@ -0,0 +1 @@ +export * from './event-category-list' diff --git a/apps/billets-app/src/ui/index.ts b/apps/billets-app/src/ui/index.ts index a8696080..348d3707 100644 --- a/apps/billets-app/src/ui/index.ts +++ b/apps/billets-app/src/ui/index.ts @@ -26,6 +26,7 @@ export * from './search-location-concert-list' export * from './search-screen-navigation-header' export * from './search.ui.constants' export * from './settings-menu-list' +export * from './subscribe-info-me' export * from './subscribed-concert-list' export * from './subscribed-concert-list-item' export * from './tab-bar' diff --git a/apps/billets-app/src/ui/search-bottom-keyword-result-list/search-bottom-keyword-result-list.tsx b/apps/billets-app/src/ui/search-bottom-keyword-result-list/search-bottom-keyword-result-list.tsx index c1a2efe2..7841b30c 100644 --- a/apps/billets-app/src/ui/search-bottom-keyword-result-list/search-bottom-keyword-result-list.tsx +++ b/apps/billets-app/src/ui/search-bottom-keyword-result-list/search-bottom-keyword-result-list.tsx @@ -1,9 +1,10 @@ import { useKeyboard } from '@/lib' -import { $api } from '@/lib/api/openapi-client' +import { apiClient } from '@/lib/api/openapi-client' import { useSearchScreenNavigation } from '@/screens/search-screen/search-screen.hooks' import { ProfileThumbnail, useColorScheme } from '@coldsurfers/ocean-road/native' import { BottomSheetFlatList } from '@gorhom/bottom-sheet' import { useFocusEffect } from '@react-navigation/native' +import { useQuery } from '@tanstack/react-query' import format from 'date-fns/format' import { useCallback, useMemo } from 'react' import { ListRenderItem, StyleSheet } from 'react-native' @@ -22,20 +23,11 @@ export const SearchBottomKeywordResultList = ({ keyword }: { keyword: string }) data: searchData, isLoading: isLoadingSearch, isFetched: isFetchedSearch, - } = $api.useQuery( - 'get', - '/v1/search/', - { - params: { - query: { - keyword, - }, - }, - }, - { - enabled: !!keyword, - }, - ) + } = useQuery({ + queryKey: apiClient.search.queryKeys.list(keyword), + queryFn: () => apiClient.search.getSearchResult(keyword), + enabled: !!keyword, + }) const searchResultUIData = useMemo(() => { return searchData ?? [] diff --git a/apps/billets-app/src/ui/subscribe-info-me/index.ts b/apps/billets-app/src/ui/subscribe-info-me/index.ts new file mode 100644 index 00000000..d475b488 --- /dev/null +++ b/apps/billets-app/src/ui/subscribe-info-me/index.ts @@ -0,0 +1 @@ +export * from './subscribe-info-me' diff --git a/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.item.tsx b/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.item.tsx new file mode 100644 index 00000000..6937a749 --- /dev/null +++ b/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.item.tsx @@ -0,0 +1,67 @@ +import { useMyScreenNavigation } from '@/screens/my-screen' +import { Text, useColorScheme } from '@coldsurfers/ocean-road/native' +import { memo, useCallback, useMemo } from 'react' +import { match } from 'ts-pattern' +import { z } from 'zod' +import { + StyledSubscribeInfoMeContainer, + StyledSubscribeInfoMeItem, + StyledSubscribeInfoMeItemImage, +} from './subscribe-info-me.styled' +import { InfoMeItemTypeSchema } from './subscribe-info-me.types' + +const refineCount = (count: number) => { + if (count > 99) { + return `99+` + } + return count +} + +export const SubscribeInfoMeItem = memo( + ({ type, count, thumbUrl }: { type: z.infer; count: number; thumbUrl?: string }) => { + const { semantics } = useColorScheme() + const refinedCount = useMemo(() => refineCount(count), [count]) + const navigation = useMyScreenNavigation() + + const onPress = useCallback(() => { + match(type) + .with('artists', () => { + navigation.navigate('SubscribedStackNavigation', { + screen: 'SubscribedArtistListScreen', + params: {}, + }) + }) + .with('events', () => { + navigation.navigate('SubscribedStackNavigation', { + screen: 'SubscribedConcertListScreen', + params: {}, + }) + }) + .with('venues', () => { + navigation.navigate('SubscribedStackNavigation', { + screen: 'SubscribedVenueListScreen', + params: {}, + }) + }) + .exhaustive() + }, [navigation, type]) + return ( + + + {thumbUrl ? : null} + + + {match(type) + .with('artists', () => `${refinedCount} 아티스트`) + .with('events', () => `${refinedCount} 공연`) + .with('venues', () => `${refinedCount} 공연장`) + .exhaustive()} + + + ) + }, +) diff --git a/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.styled.ts b/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.styled.ts new file mode 100644 index 00000000..48f2633a --- /dev/null +++ b/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.styled.ts @@ -0,0 +1,23 @@ +import styled from '@emotion/native' +import FastImage from 'react-native-fast-image' + +export const StyledSubscribeInfoMeContainer = styled.TouchableOpacity` + flex-direction: column; + align-items: center; + margin-right: 8px; +` + +export const StyledSubscribeInfoMeItem = styled.View` + border-width: 1px; + width: 92px; + height: 92px; + border-radius: 46px; + align-items: center; + justify-content: center; +` + +export const StyledSubscribeInfoMeItemImage = styled(FastImage)` + width: 84px; + height: 84px; + border-radius: 42px; +` diff --git a/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.tsx b/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.tsx new file mode 100644 index 00000000..9897e012 --- /dev/null +++ b/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.tsx @@ -0,0 +1,53 @@ +import { apiClient } from '@/lib/api/openapi-client' +import { useSuspenseQuery } from '@tanstack/react-query' +import { memo, useCallback, useMemo } from 'react' +import { FlatList, ListRenderItem, StyleSheet } from 'react-native' +import { SubscribeInfoMeItem } from './subscribe-info-me.item' +import { InfoMeItemTypeSchema } from './subscribe-info-me.types' + +export const SubscribeInfoMe = memo(() => { + const { data: subscribeInfoMe } = useSuspenseQuery({ + queryKey: apiClient.subscribe.queryKeys.infoMe, + queryFn: () => apiClient.subscribe.getInfoMe(), + }) + const data = useMemo( + () => + Object.entries(subscribeInfoMe) + .map(([key, value]) => { + return { + type: key, + value, + } + }) + .sort((a, b) => a.type.localeCompare(b.type)), + [subscribeInfoMe], + ) + const renderItem = useCallback>(({ item }) => { + const validation = InfoMeItemTypeSchema.safeParse(item.type) + if (!validation.success) { + console.error(validation.error) + return null + } + return + }, []) + + return ( + `${item.type}`} + style={styles.list} + contentContainerStyle={styles.contentList} + /> + ) +}) + +const styles = StyleSheet.create({ + list: { + flex: 1, + }, + contentList: { + paddingHorizontal: 16, + }, +}) diff --git a/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.types.ts b/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.types.ts new file mode 100644 index 00000000..06ae246d --- /dev/null +++ b/apps/billets-app/src/ui/subscribe-info-me/subscribe-info-me.types.ts @@ -0,0 +1,3 @@ +import { z } from 'zod' + +export const InfoMeItemTypeSchema = z.union([z.literal('artists'), z.literal('events'), z.literal('venues')]) diff --git a/apps/billets-app/src/ui/subscribed-artist-list-item/index.ts b/apps/billets-app/src/ui/subscribed-artist-list-item/index.ts new file mode 100644 index 00000000..31285044 --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-artist-list-item/index.ts @@ -0,0 +1 @@ +export * from './subscribed-artist-list-item' diff --git a/apps/billets-app/src/ui/subscribed-artist-list-item/subscribed-artist-list-item.tsx b/apps/billets-app/src/ui/subscribed-artist-list-item/subscribed-artist-list-item.tsx new file mode 100644 index 00000000..c5666c2d --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-artist-list-item/subscribed-artist-list-item.tsx @@ -0,0 +1,64 @@ +import { apiClient } from '@/lib/api/openapi-client' +import palettes from '@/lib/palettes' +import { components } from '@/types/api' +import { colors } from '@coldsurfers/ocean-road' +import { Text, useColorScheme } from '@coldsurfers/ocean-road/native' +import { useSuspenseQuery } from '@tanstack/react-query' +import { StyleSheet, TouchableOpacity, View } from 'react-native' +import { SearchItemThumbnail } from '../search-item-thumbnail' + +export function SubscribedArtistListItem({ + data, + onPress, +}: { + data: components['schemas']['ArtistSubscribeDTOSchema'] + onPress: (artistId: string) => void +}) { + const { semantics } = useColorScheme() + const { data: artistDetailData } = useSuspenseQuery({ + queryKey: apiClient.artist.queryKeys.detail(data.artistId), + queryFn: () => apiClient.artist.getArtistDetail(data.artistId), + }) + if (!artistDetailData) { + return null + } + const mainPoster = artistDetailData.thumbUrl + if (!mainPoster) { + return null + } + return ( + onPress(data.artistId)} style={styles.itemWrapper}> + + + + {artistDetailData.name} + + + 아티스트 + + + + ) +} + +const styles = StyleSheet.create({ + itemWrapper: { + flexDirection: 'row', + alignItems: 'center', + paddingVertical: 4, + }, + itemInnerRight: { + marginLeft: 8, + flex: 1, + }, + itemTitle: { fontSize: 14 }, + itemSubtitle: { color: palettes.gray['800'], fontSize: 14 }, + skeletonTitle: { + width: '100%', + backgroundColor: colors.oc.gray[4].value, + height: 24, + marginBottom: 4, + borderRadius: 4, + }, + skeletonSubtitle: { width: '100%', backgroundColor: colors.oc.gray[4].value, height: 16, borderRadius: 4 }, +}) diff --git a/apps/billets-app/src/ui/subscribed-artist-list/index.ts b/apps/billets-app/src/ui/subscribed-artist-list/index.ts new file mode 100644 index 00000000..604523a2 --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-artist-list/index.ts @@ -0,0 +1 @@ +export * from './subscribed-artist-list' diff --git a/apps/billets-app/src/ui/subscribed-artist-list/subscribed-artist-list.styles.ts b/apps/billets-app/src/ui/subscribed-artist-list/subscribed-artist-list.styles.ts new file mode 100644 index 00000000..649b1b12 --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-artist-list/subscribed-artist-list.styles.ts @@ -0,0 +1,11 @@ +import { StyleSheet } from 'react-native' + +export const subscribedArtistListStyles = StyleSheet.create({ + contentContainer: { + paddingHorizontal: 16, + marginTop: 12, + }, + itemSeparator: { + width: 10, + }, +}) diff --git a/apps/billets-app/src/ui/subscribed-artist-list/subscribed-artist-list.tsx b/apps/billets-app/src/ui/subscribed-artist-list/subscribed-artist-list.tsx new file mode 100644 index 00000000..5ad7b47d --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-artist-list/subscribed-artist-list.tsx @@ -0,0 +1,104 @@ +import { apiClient } from '@/lib/api/openapi-client' +import { useSubscribedArtistListScreenNavigation } from '@/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.hooks' +import { Spinner, useColorScheme } from '@coldsurfers/ocean-road/native' +import { useSuspenseInfiniteQuery } from '@tanstack/react-query' +import { Suspense, useCallback, useMemo, useState } from 'react' +import { FlatList, ListRenderItem, StyleSheet, View } from 'react-native' +import { SubscribedArtistListItem } from '../subscribed-artist-list-item' +import { subscribedArtistListStyles } from './subscribed-artist-list.styles' + +const ItemSeparator = () => + +const PER_PAGE = 20 + +export function SubscribedArtistList({ listHeaderComponent }: { listHeaderComponent?: React.ComponentType }) { + const { semantics } = useColorScheme() + const navigation = useSubscribedArtistListScreenNavigation() + const [isRefreshing, setIsRefreshing] = useState(false) + const { data, fetchNextPage, isFetchingNextPage, isLoading, hasNextPage, isPending, refetch } = + useSuspenseInfiniteQuery({ + initialPageParam: 0, + queryKey: apiClient.subscribe.queryKeys.artistList({}), + queryFn: ({ pageParam = 0 }) => apiClient.subscribe.getArtistList({ offset: pageParam, size: PER_PAGE }), + getNextPageParam: (lastPage, allPages) => { + if (!lastPage) { + return undefined + } + if (lastPage.length < PER_PAGE) { + return undefined + } + return allPages.length * PER_PAGE + }, + }) + const listData = useMemo(() => { + return data?.pages.flat() ?? [] + }, [data]) + const renderItem = useCallback>( + ({ item }) => { + const onPress = () => { + navigation.navigate('ArtistStackNavigation', { + params: { + artistId: item.artistId, + }, + screen: 'ArtistDetailScreen', + }) + } + return ( + + + + ) + }, + [navigation], + ) + + const onEndReached = useCallback(async () => { + if (isFetchingNextPage || isLoading || !hasNextPage || isPending) { + return + } + await fetchNextPage() + }, [fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, isPending]) + + const onRefresh = useCallback(async () => { + setIsRefreshing(true) + await refetch() + setIsRefreshing(false) + }, [refetch]) + + return ( + `${item.artistId}`} + renderItem={renderItem} + ItemSeparatorComponent={ItemSeparator} + contentContainerStyle={[ + { + backgroundColor: semantics.background[3], + }, + styles.contentContainer, + ]} + ListFooterComponent={isFetchingNextPage ? : null} + ListFooterComponentStyle={styles.listFooter} + ListHeaderComponent={listHeaderComponent} + onEndReached={onEndReached} + onRefresh={onRefresh} + refreshing={isRefreshing} + showsHorizontalScrollIndicator={false} + showsVerticalScrollIndicator={false} + style={{ + backgroundColor: semantics.background[3], + }} + /> + ) +} + +const styles = StyleSheet.create({ + contentContainer: { + paddingHorizontal: 16, + paddingBottom: 24, + marginTop: 12, + }, + listFooter: { + paddingBottom: 24, + }, +}) diff --git a/apps/billets-app/src/ui/subscribed-concert-list/subscribed-concert-list.tsx b/apps/billets-app/src/ui/subscribed-concert-list/subscribed-concert-list.tsx index 721569e8..9edcaa66 100644 --- a/apps/billets-app/src/ui/subscribed-concert-list/subscribed-concert-list.tsx +++ b/apps/billets-app/src/ui/subscribed-concert-list/subscribed-concert-list.tsx @@ -1,7 +1,8 @@ import { apiClient } from '@/lib/api/openapi-client' +import { Spinner, useColorScheme } from '@coldsurfers/ocean-road/native' import { useSuspenseInfiniteQuery } from '@tanstack/react-query' import { Suspense, useCallback, useMemo, useState } from 'react' -import { FlatList, ListRenderItem, View } from 'react-native' +import { FlatList, ListRenderItem, StyleSheet, View } from 'react-native' import { ConcertListItem } from '../concert-list-item' import { SubscribedConcertListItem } from '../subscribed-concert-list-item' import { subscribedConcertListStyles } from './subscribed-concert-list.styles' @@ -19,6 +20,7 @@ export function SubscribedConcertList({ horizontal?: boolean listHeaderComponent?: React.ComponentType }) { + const { semantics } = useColorScheme() const [isRefreshing, setIsRefreshing] = useState(false) const { data: concertListData, @@ -97,7 +99,14 @@ export function SubscribedConcertList({ keyExtractor={(item) => `${item.eventId}`} renderItem={renderItem} ItemSeparatorComponent={ItemSeparator} - contentContainerStyle={subscribedConcertListStyles.contentContainer} + contentContainerStyle={[ + { + backgroundColor: semantics.background[3], + }, + styles.contentContainer, + ]} + ListFooterComponent={isFetchingNextPage ? : null} + ListFooterComponentStyle={styles.listFooter} ListHeaderComponent={listHeaderComponent} onEndReached={horizontal ? undefined : onEndReached} onRefresh={horizontal ? undefined : onRefresh} @@ -105,6 +114,16 @@ export function SubscribedConcertList({ showsHorizontalScrollIndicator={false} showsVerticalScrollIndicator={false} bounces={!horizontal} + style={{ + backgroundColor: semantics.background[3], + }} /> ) } + +const styles = StyleSheet.create({ + contentContainer: { paddingHorizontal: 16, paddingBottom: 24, marginTop: 12 }, + listFooter: { + paddingBottom: 24, + }, +}) diff --git a/apps/billets-app/src/ui/subscribed-venue-list-item/index.ts b/apps/billets-app/src/ui/subscribed-venue-list-item/index.ts new file mode 100644 index 00000000..be734b99 --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-venue-list-item/index.ts @@ -0,0 +1 @@ +export * from './subscribed-venue-list-item' diff --git a/apps/billets-app/src/ui/subscribed-venue-list-item/subscribed-venue-list-item.tsx b/apps/billets-app/src/ui/subscribed-venue-list-item/subscribed-venue-list-item.tsx new file mode 100644 index 00000000..b7014e57 --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-venue-list-item/subscribed-venue-list-item.tsx @@ -0,0 +1,60 @@ +import { apiClient } from '@/lib/api/openapi-client' +import palettes from '@/lib/palettes' +import { components } from '@/types/api' +import { colors } from '@coldsurfers/ocean-road' +import { Text, useColorScheme } from '@coldsurfers/ocean-road/native' +import { useSuspenseQuery } from '@tanstack/react-query' +import { StyleSheet, TouchableOpacity, View } from 'react-native' +import { SearchItemThumbnail } from '../search-item-thumbnail' + +export function SubscribedVenueListItem({ + data, + onPress, +}: { + data: components['schemas']['VenueSubscribeDTOSchema'] + onPress: (venueId: string) => void +}) { + const { semantics } = useColorScheme() + const { data: venueDetailData } = useSuspenseQuery({ + queryKey: apiClient.venue.queryKeys.detail(data.venueId), + queryFn: () => apiClient.venue.getVenueDetail(data.venueId), + }) + if (!venueDetailData) { + return null + } + return ( + onPress(data.venueId)} style={styles.itemWrapper}> + + + + {venueDetailData.name} + + + 공연장 + + + + ) +} + +const styles = StyleSheet.create({ + itemWrapper: { + flexDirection: 'row', + alignItems: 'center', + paddingVertical: 4, + }, + itemInnerRight: { + marginLeft: 8, + flex: 1, + }, + itemTitle: { fontSize: 14 }, + itemSubtitle: { color: palettes.gray['800'], fontSize: 14 }, + skeletonTitle: { + width: '100%', + backgroundColor: colors.oc.gray[4].value, + height: 24, + marginBottom: 4, + borderRadius: 4, + }, + skeletonSubtitle: { width: '100%', backgroundColor: colors.oc.gray[4].value, height: 16, borderRadius: 4 }, +}) diff --git a/apps/billets-app/src/ui/subscribed-venue-list/index.ts b/apps/billets-app/src/ui/subscribed-venue-list/index.ts new file mode 100644 index 00000000..ef8d5118 --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-venue-list/index.ts @@ -0,0 +1 @@ +export * from './subscribed-venue-list' diff --git a/apps/billets-app/src/ui/subscribed-venue-list/subscribed-venue-list.styles.ts b/apps/billets-app/src/ui/subscribed-venue-list/subscribed-venue-list.styles.ts new file mode 100644 index 00000000..5eb7cd52 --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-venue-list/subscribed-venue-list.styles.ts @@ -0,0 +1,11 @@ +import { StyleSheet } from 'react-native' + +export const subscribedVenueListStyles = StyleSheet.create({ + contentContainer: { + paddingHorizontal: 16, + marginTop: 12, + }, + itemSeparator: { + width: 10, + }, +}) diff --git a/apps/billets-app/src/ui/subscribed-venue-list/subscribed-venue-list.tsx b/apps/billets-app/src/ui/subscribed-venue-list/subscribed-venue-list.tsx new file mode 100644 index 00000000..336af1ad --- /dev/null +++ b/apps/billets-app/src/ui/subscribed-venue-list/subscribed-venue-list.tsx @@ -0,0 +1,104 @@ +import { apiClient } from '@/lib/api/openapi-client' +import { useSubscribedArtistListScreenNavigation } from '@/screens/subscribed-artist-list-screen/subscribed-artist-list-screen.hooks' +import { Spinner, useColorScheme } from '@coldsurfers/ocean-road/native' +import { useSuspenseInfiniteQuery } from '@tanstack/react-query' +import { Suspense, useCallback, useMemo, useState } from 'react' +import { FlatList, ListRenderItem, StyleSheet, View } from 'react-native' +import { SubscribedVenueListItem } from '../subscribed-venue-list-item' +import { subscribedVenueListStyles } from './subscribed-venue-list.styles' + +const ItemSeparator = () => + +const PER_PAGE = 20 + +export function SubscribedVenueList({ listHeaderComponent }: { listHeaderComponent?: React.ComponentType }) { + const { semantics } = useColorScheme() + const navigation = useSubscribedArtistListScreenNavigation() + const [isRefreshing, setIsRefreshing] = useState(false) + const { data, fetchNextPage, isFetchingNextPage, isLoading, hasNextPage, isPending, refetch } = + useSuspenseInfiniteQuery({ + initialPageParam: 0, + queryKey: apiClient.subscribe.queryKeys.venueList({}), + queryFn: ({ pageParam = 0 }) => apiClient.subscribe.getVenueList({ offset: pageParam, size: PER_PAGE }), + getNextPageParam: (lastPage, allPages) => { + if (!lastPage) { + return undefined + } + if (lastPage.length < PER_PAGE) { + return undefined + } + return allPages.length * PER_PAGE + }, + }) + const listData = useMemo(() => { + return data?.pages.flat() ?? [] + }, [data]) + const renderItem = useCallback>( + ({ item }) => { + const onPress = () => { + navigation.navigate('VenueStackNavigation', { + params: { + id: item.venueId, + }, + screen: 'VenueDetailScreen', + }) + } + return ( + + + + ) + }, + [navigation], + ) + + const onEndReached = useCallback(async () => { + if (isFetchingNextPage || isLoading || !hasNextPage || isPending) { + return + } + await fetchNextPage() + }, [fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, isPending]) + + const onRefresh = useCallback(async () => { + setIsRefreshing(true) + await refetch() + setIsRefreshing(false) + }, [refetch]) + + return ( + `${item.venueId}`} + renderItem={renderItem} + ItemSeparatorComponent={ItemSeparator} + contentContainerStyle={[ + { + backgroundColor: semantics.background[3], + }, + styles.contentContainer, + ]} + ListHeaderComponent={listHeaderComponent} + ListFooterComponent={isFetchingNextPage ? : null} + ListFooterComponentStyle={styles.listFooter} + onEndReached={onEndReached} + onRefresh={onRefresh} + refreshing={isRefreshing} + showsHorizontalScrollIndicator={false} + showsVerticalScrollIndicator={false} + style={{ + backgroundColor: semantics.background[3], + }} + /> + ) +} + +const styles = StyleSheet.create({ + contentContainer: { + paddingHorizontal: 16, + paddingBottom: 24, + marginTop: 12, + }, + listFooter: { + paddingBottom: 24, + }, +}) diff --git a/apps/billets-app/src/ui/ticket-item/ticket-item.tsx b/apps/billets-app/src/ui/ticket-item/ticket-item.tsx index 2a18a0b7..8de18dd6 100644 --- a/apps/billets-app/src/ui/ticket-item/ticket-item.tsx +++ b/apps/billets-app/src/ui/ticket-item/ticket-item.tsx @@ -1,6 +1,7 @@ import { useInterstitialAd } from '@/features/google-ads/google-ads.hooks' import { concertTicketBtnPressCountForInterstitialAdStorage } from '@/lib/storage/concert-ticket-btn-press-count-for-interstitial-ad-storage' import { components } from '@/types/api' +import { colors } from '@coldsurfers/ocean-road' import { Button, Text, useColorScheme } from '@coldsurfers/ocean-road/native' import { SquareArrowOutUpRight } from 'lucide-react-native' import { memo, useCallback } from 'react' @@ -36,11 +37,11 @@ export const TicketItem = memo(({ sellerName, url }: TicketItemProps) => { {sellerName} diff --git a/apps/billets-server/package.json b/apps/billets-server/package.json index ce147dfe..2a358bd6 100644 --- a/apps/billets-server/package.json +++ b/apps/billets-server/package.json @@ -46,7 +46,7 @@ "crypto-js": "4.2.0", "date-fns": "^4.1.0", "dotenv": "^16.0.3", - "fastify": "*", + "fastify": "5.0.0", "fastify-plugin": "^5.0.1", "fastify-type-provider-zod": "^3.0.0", "google-auth-library": "^9.14.1", diff --git a/apps/wamuseum-server/package.json b/apps/wamuseum-server/package.json index 1820dccb..ef805189 100644 --- a/apps/wamuseum-server/package.json +++ b/apps/wamuseum-server/package.json @@ -34,7 +34,7 @@ "crypto-js": "4.2.0", "date-fns": "^2.29.3", "dotenv": "^16.0.3", - "fastify": "*", + "fastify": "5.0.0", "firebase-admin": "^13.0.1", "graphql": "^16.8.1", "jsonwebtoken": "^9.0.0", diff --git a/package.json b/package.json index 23b7fcd1..d65f06f6 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "@types/react-native": "0.70.8", "react-native": "0.75.3", "react-native-web": "0.19.13", - "fastify": "5.0.0", "zod": "3.23.8", "zustand": "5.0.1", "ts-pattern": "5.4.0", diff --git a/packages/ocean-road/src/native/button/button.styled.ts b/packages/ocean-road/src/native/button/button.styled.ts index e7e55aab..901b8531 100644 --- a/packages/ocean-road/src/native/button/button.styled.ts +++ b/packages/ocean-road/src/native/button/button.styled.ts @@ -5,7 +5,7 @@ import { getButtonBackgroundColor, getButtonForegroundColor } from '../../button import { colors } from '../../tokens' import { Text } from '../text' -export const StyledButton = styled.Pressable<{ +export const StyledButton = styled.TouchableOpacity<{ colorTheme: ButtonTheme size: 'lg' | 'md' | 'sm' }>` diff --git a/patches/@shopify+react-native-performance+4.1.2.patch b/patches/@shopify+react-native-performance+4.1.2.patch new file mode 100644 index 00000000..9d997b11 --- /dev/null +++ b/patches/@shopify+react-native-performance+4.1.2.patch @@ -0,0 +1,11 @@ +diff --git a/node_modules/@shopify/react-native-performance/ios/ReactNativePerformance/ReactNativePerformance.m b/node_modules/@shopify/react-native-performance/ios/ReactNativePerformance/ReactNativePerformance.m +index 4852113..dbb4bb5 100644 +--- a/node_modules/@shopify/react-native-performance/ios/ReactNativePerformance/ReactNativePerformance.m ++++ b/node_modules/@shopify/react-native-performance/ios/ReactNativePerformance/ReactNativePerformance.m +@@ -1,5 +1,5 @@ + #import "ReactNativePerformance.h" +-#import "ReactNativePerformance-Swift.h" ++#import + + static NSTimeInterval startupTimestamp = -1.0; + diff --git a/yarn.lock b/yarn.lock index 124529b7..3bb15074 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2116,7 +2116,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -3899,6 +3899,80 @@ __metadata: languageName: node linkType: hard +"@callstack/repack-dev-server@npm:5.0.0-rc.10": + version: 5.0.0-rc.10 + resolution: "@callstack/repack-dev-server@npm:5.0.0-rc.10" + dependencies: + "@babel/code-frame": "npm:^7.16.7" + "@fastify/middie": "npm:^8.3.0" + "@fastify/sensible": "npm:^5.5.0" + "@react-native/dev-middleware": "npm:^0.76.1" + fastify: "npm:^4.24.3" + fastify-favicon: "npm:^4.3.0" + fastify-plugin: "npm:^4.5.1" + pretty-format: "npm:^28.1.0" + source-map: "npm:^0.7.4" + ws: "npm:^8.7.0" + peerDependencies: + "@react-native-community/cli-server-api": ">=13.6.4" + peerDependenciesMeta: + "@react-native-community/cli-server-api": + optional: true + checksum: 10c0/d24ee1fa693616e7fb87a3db363d88dd396a07e458d8acb85263b260434f2d946e67dd890b3bee45401377bab515efacf49b0aad4413566699c4406bec099e1e + languageName: node + linkType: hard + +"@callstack/repack-plugin-reanimated@npm:5.0.0-rc.6": + version: 5.0.0-rc.6 + resolution: "@callstack/repack-plugin-reanimated@npm:5.0.0-rc.6" + peerDependencies: + "@babel/core": ^7.20 + "@callstack/repack": ^5.0.0-rc.6 + checksum: 10c0/133915fbcf62ade2d861611b9ada92f6e3e2804ffd48d11691a63ed3a99c8090c572ba27ca33deea956ca211a31c8e5d049af7dd80496fef5818e0c78b502d26 + languageName: node + linkType: hard + +"@callstack/repack@npm:5.0.0-rc.10": + version: 5.0.0-rc.10 + resolution: "@callstack/repack@npm:5.0.0-rc.10" + dependencies: + "@callstack/repack-dev-server": "npm:5.0.0-rc.10" + "@discoveryjs/json-ext": "npm:^0.5.7" + "@rspack/plugin-react-refresh": "npm:1.0.0" + babel-loader: "npm:^9.2.1" + colorette: "npm:^2.0.20" + dedent: "npm:^0.7.0" + estree-util-is-identifier-name: "npm:^1.1.0" + events: "npm:^3.3.0" + execa: "npm:^5.0.0" + flow-remove-types: "npm:^2.250.0" + image-size: "npm:^1.1.1" + jsonwebtoken: "npm:^9.0.2" + memfs: "npm:^4.11.1" + mime-types: "npm:^2.1.35" + pretty-format: "npm:^26.6.2" + react-refresh: "npm:^0.14.0" + schema-utils: "npm:^4.2.0" + shallowequal: "npm:^1.1.0" + throttleit: "npm:^2.1.0" + peerDependencies: + "@module-federation/enhanced": ">=0.6.10" + "@react-native-community/cli": "*" + "@react-native-community/cli-types": "*" + "@rspack/core": ">=1" + react-native: ">=0.74" + webpack: ">=5.90" + peerDependenciesMeta: + "@module-federation/enhanced": + optional: true + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/0be0428fcdd038c17779f728152113489c7e4b7efffeb06b9ee774d2b5fc401981eab1a7527e24c72483f883b4cce33dc243bdbf1d6e506eede3f3f7d6c8ba3f + languageName: node + linkType: hard + "@cnakazawa/watch@npm:^1.0.3": version: 1.0.4 resolution: "@cnakazawa/watch@npm:1.0.4" @@ -3918,6 +3992,8 @@ __metadata: "@babel/core": "npm:^7.20.0" "@babel/preset-env": "npm:^7.20.0" "@babel/runtime": "npm:^7.20.0" + "@callstack/repack": "npm:5.0.0-rc.10" + "@callstack/repack-plugin-reanimated": "npm:5.0.0-rc.6" "@coldsurfers/ocean-road": "workspace:*" "@emotion/native": "npm:*" "@emotion/react": "npm:*" @@ -3940,6 +4016,9 @@ __metadata: "@react-navigation/bottom-tabs": "npm:^6.5.11" "@react-navigation/native": "npm:^6.1.9" "@react-navigation/native-stack": "npm:^6.9.17" + "@rspack/core": "npm:^1.2.2" + "@shopify/react-native-performance": "npm:^4.1.2" + "@swc/helpers": "npm:^0.5.15" "@tanstack/eslint-plugin-query": "npm:^5.58.1" "@tanstack/react-query": "npm:*" "@types/lodash.uniqby": "npm:^4" @@ -3952,6 +4031,7 @@ __metadata: "@uidotdev/usehooks": "npm:^2.4.1" babel-jest: "npm:^29.6.3" babel-plugin-module-resolver: "npm:^5.0.2" + babel-plugin-syntax-hermes-parser: "npm:^0.26.0" date-fns: "npm:^2.29.3" detox: "npm:^19.8.1" eslint: "npm:8.57.0" @@ -4029,7 +4109,7 @@ __metadata: dotenv: "npm:^16.0.3" dpdm: "npm:^3.14.0" eslint: "npm:8.57.0" - fastify: "npm:*" + fastify: "npm:5.0.0" fastify-plugin: "npm:^5.0.1" fastify-type-provider-zod: "npm:^3.0.0" google-auth-library: "npm:^9.14.1" @@ -4495,7 +4575,7 @@ __metadata: date-fns: "npm:^2.29.3" dotenv: "npm:^16.0.3" eslint: "npm:8.57.0" - fastify: "npm:*" + fastify: "npm:5.0.0" firebase-admin: "npm:^13.0.1" graphql: "npm:^16.8.1" jsonwebtoken: "npm:^9.0.0" @@ -4740,7 +4820,7 @@ __metadata: languageName: node linkType: hard -"@discoveryjs/json-ext@npm:^0.5.3": +"@discoveryjs/json-ext@npm:^0.5.3, @discoveryjs/json-ext@npm:^0.5.7": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c @@ -5465,6 +5545,17 @@ __metadata: languageName: node linkType: hard +"@fastify/ajv-compiler@npm:^3.5.0": + version: 3.6.0 + resolution: "@fastify/ajv-compiler@npm:3.6.0" + dependencies: + ajv: "npm:^8.11.0" + ajv-formats: "npm:^2.1.1" + fast-uri: "npm:^2.0.0" + checksum: 10c0/f0be2ca1f75833492829c52c5f5ef0ec118bdd010614e002a6366952c27297c0f6a7dafb5917a0f9c4aaa84aa32a39e520c6d837fa251748717d58590cfc8177 + languageName: node + linkType: hard + "@fastify/ajv-compiler@npm:^4.0.0": version: 4.0.1 resolution: "@fastify/ajv-compiler@npm:4.0.1" @@ -5517,6 +5608,13 @@ __metadata: languageName: node linkType: hard +"@fastify/error@npm:^3.2.0, @fastify/error@npm:^3.3.0, @fastify/error@npm:^3.4.0": + version: 3.4.1 + resolution: "@fastify/error@npm:3.4.1" + checksum: 10c0/1f1a0faa8c86639afb6f4bd47a9cdc1f0f20ce0d6944340fbdec8218aaba91dc9cae9ed78e24e61bceb782a867efda2b9a6320091f00dcbb896d9c8a9bdf5f96 + languageName: node + linkType: hard + "@fastify/error@npm:^4.0.0": version: 4.0.0 resolution: "@fastify/error@npm:4.0.0" @@ -5524,6 +5622,15 @@ __metadata: languageName: node linkType: hard +"@fastify/fast-json-stringify-compiler@npm:^4.3.0": + version: 4.3.0 + resolution: "@fastify/fast-json-stringify-compiler@npm:4.3.0" + dependencies: + fast-json-stringify: "npm:^5.7.0" + checksum: 10c0/513ef296f5ed682f7a460cfa6c5fb917a32fc540111b873c9937f944558e021492b18f30f9fd8dd20db252381a4428adbcc9f03a077f16c86d02f081eb490c7b + languageName: node + linkType: hard + "@fastify/fast-json-stringify-compiler@npm:^5.0.0": version: 5.0.1 resolution: "@fastify/fast-json-stringify-compiler@npm:5.0.1" @@ -5546,7 +5653,7 @@ __metadata: languageName: node linkType: hard -"@fastify/merge-json-schemas@npm:^0.1.1": +"@fastify/merge-json-schemas@npm:^0.1.0, @fastify/merge-json-schemas@npm:^0.1.1": version: 0.1.1 resolution: "@fastify/merge-json-schemas@npm:0.1.1" dependencies: @@ -5555,6 +5662,18 @@ __metadata: languageName: node linkType: hard +"@fastify/middie@npm:^8.3.0": + version: 8.3.3 + resolution: "@fastify/middie@npm:8.3.3" + dependencies: + "@fastify/error": "npm:^3.2.0" + fastify-plugin: "npm:^4.0.0" + path-to-regexp: "npm:^6.3.0" + reusify: "npm:^1.0.4" + checksum: 10c0/802a1a51d25d2651fcdd223f058530cad8c8b55a9adb764bd47e55e4656d1c4b3ce71a58fe40c8307ddef56750ce0ba93b9df14ead5d01e2a6590b677ec393ab + languageName: node + linkType: hard + "@fastify/rate-limit@npm:^10.2.1": version: 10.2.1 resolution: "@fastify/rate-limit@npm:10.2.1" @@ -5579,6 +5698,21 @@ __metadata: languageName: node linkType: hard +"@fastify/sensible@npm:^5.5.0": + version: 5.6.0 + resolution: "@fastify/sensible@npm:5.6.0" + dependencies: + "@lukeed/ms": "npm:^2.0.1" + fast-deep-equal: "npm:^3.1.1" + fastify-plugin: "npm:^4.0.0" + forwarded: "npm:^0.2.0" + http-errors: "npm:^2.0.0" + type-is: "npm:^1.6.18" + vary: "npm:^1.1.2" + checksum: 10c0/de10e57a029c27fdc581f8c4a08cb4ab50c36cda3dc4ecdf08051335b48a82b74db2bc7ec69b51ab5fc348b60b18ff3f663eb39ce3d08061733f92bb0cd6b924 + languageName: node + linkType: hard + "@fastify/static@npm:^8.0.0": version: 8.0.2 resolution: "@fastify/static@npm:8.0.2" @@ -8085,6 +8219,15 @@ __metadata: languageName: node linkType: hard +"@jest/schemas@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/schemas@npm:28.1.3" + dependencies: + "@sinclair/typebox": "npm:^0.24.1" + checksum: 10c0/8c325918f3e1b83e687987b05c2e5143d171f372b091f891fe17835f06fadd864ddae3c7e221a704bdd7e2ea28c4b337124c02023d8affcbdd51eca2879162ac + languageName: node + linkType: hard + "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -8289,6 +8432,38 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/base64@npm:^1.1.1": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 10c0/88717945f66dc89bf58ce75624c99fe6a5c9a0c8614e26d03e406447b28abff80c69fb37dabe5aafef1862cf315071ae66e5c85f6018b437d95f8d13d235e6eb + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.0.3": + version: 1.1.1 + resolution: "@jsonjoy.com/json-pack@npm:1.1.1" + dependencies: + "@jsonjoy.com/base64": "npm:^1.1.1" + "@jsonjoy.com/util": "npm:^1.1.2" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^1.20.0" + peerDependencies: + tslib: 2 + checksum: 10c0/fd0d8baa0c8eba536924540717901e0d7eed742576991033cceeb32dcce801ee0a4318cf6eb40b444c9e78f69ddbd4f38b9eb0041e9e54c17e7b6d1219b12e1d + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.1.2, @jsonjoy.com/util@npm:^1.3.0": + version: 1.5.0 + resolution: "@jsonjoy.com/util@npm:1.5.0" + peerDependencies: + tslib: 2 + checksum: 10c0/0065ae12c4108d8aede01a479c8d2b5a39bce99e9a449d235befc753f57e8385d9c1115720529f26597840b7398d512898155423d9859fd638319fb0c827365d + languageName: node + linkType: hard + "@ljharb/through@npm:^2.3.13": version: 2.3.13 resolution: "@ljharb/through@npm:2.3.13" @@ -8387,6 +8562,52 @@ __metadata: languageName: node linkType: hard +"@module-federation/error-codes@npm:0.8.4": + version: 0.8.4 + resolution: "@module-federation/error-codes@npm:0.8.4" + checksum: 10c0/970508e4edf0f443eec5c1a82aba342be5235d44dedf2f8d68739151878894afde8f04859fcebff688016e2a369a9f0273171378bc691d002901295afe142bf4 + languageName: node + linkType: hard + +"@module-federation/runtime-tools@npm:0.8.4": + version: 0.8.4 + resolution: "@module-federation/runtime-tools@npm:0.8.4" + dependencies: + "@module-federation/runtime": "npm:0.8.4" + "@module-federation/webpack-bundler-runtime": "npm:0.8.4" + checksum: 10c0/82da5767a7384b898ce988c06434c26280aa0756e07a646ffee0d8da8e1ba2e65d5d55643c522f6d96c2e208b2a50bf57c0fe8769510d7711780f9c65f8ac18f + languageName: node + linkType: hard + +"@module-federation/runtime@npm:0.8.4": + version: 0.8.4 + resolution: "@module-federation/runtime@npm:0.8.4" + dependencies: + "@module-federation/error-codes": "npm:0.8.4" + "@module-federation/sdk": "npm:0.8.4" + checksum: 10c0/916ce10f6c12c2b319a2e20d07dc83baa2630fe591b6fba68453d91bb65b5bafec7370ad814cc4128be92ea9c857d880716e1341d3a74c0d66bcf2f1f7f16ece + languageName: node + linkType: hard + +"@module-federation/sdk@npm:0.8.4": + version: 0.8.4 + resolution: "@module-federation/sdk@npm:0.8.4" + dependencies: + isomorphic-rslog: "npm:0.0.6" + checksum: 10c0/817fb03ae8136e648ce4f6f92419ed47bf1644c7adb744c91ddb7dabf9530e1a293c3012b61f537c401a728b4a2c9029065369e02cb3d7f26bb3b82a45e836be + languageName: node + linkType: hard + +"@module-federation/webpack-bundler-runtime@npm:0.8.4": + version: 0.8.4 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.8.4" + dependencies: + "@module-federation/runtime": "npm:0.8.4" + "@module-federation/sdk": "npm:0.8.4" + checksum: 10c0/3192ef3e08486d17cad5f8a35dd34b6c0f56d4c40097487d1ee59f6a68cc52eb8923927b87f1c1afee27851739b08999cb310643a1bd761c7da936b85b241a7c + languageName: node + linkType: hard + "@mrmlnc/readdir-enhanced@npm:^2.2.1": version: 2.2.1 resolution: "@mrmlnc/readdir-enhanced@npm:2.2.1" @@ -9918,6 +10139,13 @@ __metadata: languageName: node linkType: hard +"@react-native/debugger-frontend@npm:0.76.7": + version: 0.76.7 + resolution: "@react-native/debugger-frontend@npm:0.76.7" + checksum: 10c0/eee8c72e5d03bd6ed705fddd464f95dda09d79d01f1a846388f67eabebd43b568625eb5b4e8cd932ef10e392ab90fedf51a1e9f811ed11ed445051f3712c25bb + languageName: node + linkType: hard + "@react-native/dev-middleware@npm:0.75.3": version: 0.75.3 resolution: "@react-native/dev-middleware@npm:0.75.3" @@ -9938,6 +10166,26 @@ __metadata: languageName: node linkType: hard +"@react-native/dev-middleware@npm:^0.76.1": + version: 0.76.7 + resolution: "@react-native/dev-middleware@npm:0.76.7" + dependencies: + "@isaacs/ttlcache": "npm:^1.4.1" + "@react-native/debugger-frontend": "npm:0.76.7" + chrome-launcher: "npm:^0.15.2" + chromium-edge-launcher: "npm:^0.2.0" + connect: "npm:^3.6.5" + debug: "npm:^2.2.0" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + open: "npm:^7.0.3" + selfsigned: "npm:^2.4.1" + serve-static: "npm:^1.13.1" + ws: "npm:^6.2.3" + checksum: 10c0/e9f8be47f487ffc36e6465f28c3034b8dd33c6a343f8124c7d4086b769a72ac4e38c7653baf43836e9a7c8c47e9e09028bf29b831eed0c84e8a7bab3d64f5f09 + languageName: node + linkType: hard + "@react-native/eslint-config@npm:0.75.3": version: 0.75.3 resolution: "@react-native/eslint-config@npm:0.75.3" @@ -10502,6 +10750,147 @@ __metadata: languageName: node linkType: hard +"@rspack/binding-darwin-arm64@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-darwin-arm64@npm:1.2.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rspack/binding-darwin-x64@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-darwin-x64@npm:1.2.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding-linux-arm64-gnu@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.2.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rspack/binding-linux-arm64-musl@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.2.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rspack/binding-linux-x64-gnu@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.2.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rspack/binding-linux-x64-musl@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-linux-x64-musl@npm:1.2.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rspack/binding-win32-arm64-msvc@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.2.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rspack/binding-win32-ia32-msvc@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.2.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rspack/binding-win32-x64-msvc@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.2.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding@npm:1.2.2": + version: 1.2.2 + resolution: "@rspack/binding@npm:1.2.2" + dependencies: + "@rspack/binding-darwin-arm64": "npm:1.2.2" + "@rspack/binding-darwin-x64": "npm:1.2.2" + "@rspack/binding-linux-arm64-gnu": "npm:1.2.2" + "@rspack/binding-linux-arm64-musl": "npm:1.2.2" + "@rspack/binding-linux-x64-gnu": "npm:1.2.2" + "@rspack/binding-linux-x64-musl": "npm:1.2.2" + "@rspack/binding-win32-arm64-msvc": "npm:1.2.2" + "@rspack/binding-win32-ia32-msvc": "npm:1.2.2" + "@rspack/binding-win32-x64-msvc": "npm:1.2.2" + dependenciesMeta: + "@rspack/binding-darwin-arm64": + optional: true + "@rspack/binding-darwin-x64": + optional: true + "@rspack/binding-linux-arm64-gnu": + optional: true + "@rspack/binding-linux-arm64-musl": + optional: true + "@rspack/binding-linux-x64-gnu": + optional: true + "@rspack/binding-linux-x64-musl": + optional: true + "@rspack/binding-win32-arm64-msvc": + optional: true + "@rspack/binding-win32-ia32-msvc": + optional: true + "@rspack/binding-win32-x64-msvc": + optional: true + checksum: 10c0/4d9453847808675f0dbcb629b3acee4bda01ce91b4f3b2fbde9f26518535ef9a186bc5623461c2d46c9f311a46397296d8916c524acb5c40b2440867c8ee5ff7 + languageName: node + linkType: hard + +"@rspack/core@npm:^1.2.2": + version: 1.2.2 + resolution: "@rspack/core@npm:1.2.2" + dependencies: + "@module-federation/runtime-tools": "npm:0.8.4" + "@rspack/binding": "npm:1.2.2" + "@rspack/lite-tapable": "npm:1.0.1" + caniuse-lite: "npm:^1.0.30001616" + peerDependencies: + "@rspack/tracing": ^1.x + "@swc/helpers": ">=0.5.1" + peerDependenciesMeta: + "@rspack/tracing": + optional: true + "@swc/helpers": + optional: true + checksum: 10c0/299f0161d5532b784197d632bb12cf996b7504264997de0cf6d72e45ee50ffe29af392899dddfcb4eb48a44199262d1d318d7710a775ae62cba6a374e850ab24 + languageName: node + linkType: hard + +"@rspack/lite-tapable@npm:1.0.1": + version: 1.0.1 + resolution: "@rspack/lite-tapable@npm:1.0.1" + checksum: 10c0/90bb1bc414dc51ea2d0933e09f78d25584f3f50a85f4cb8228930bd29e5931bf55eff4f348a06c51dd3149fc73b8ae3920bf0ae5ae8a0c9fe1d9b404e6ecf5b7 + languageName: node + linkType: hard + +"@rspack/plugin-react-refresh@npm:1.0.0": + version: 1.0.0 + resolution: "@rspack/plugin-react-refresh@npm:1.0.0" + dependencies: + error-stack-parser: "npm:^2.0.6" + html-entities: "npm:^2.1.0" + peerDependencies: + react-refresh: ">=0.10.0 <1.0.0" + peerDependenciesMeta: + react-refresh: + optional: true + checksum: 10c0/f40752b6f5757be59c99b2ac2b449ac4fd2d394f4330a75151b99eb6566ade22cd9a2f5f359588cb5787703c6ec4ee30037ffe40b59dacf5826c82038a09c0cd + languageName: node + linkType: hard + "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -10516,6 +10905,17 @@ __metadata: languageName: node linkType: hard +"@shopify/react-native-performance@npm:^4.1.2": + version: 4.1.2 + resolution: "@shopify/react-native-performance@npm:4.1.2" + peerDependencies: + "@babel/runtime": "*" + react: "*" + react-native: "*" + checksum: 10c0/b11fad3e735e13621bd94faf38fdef5ef8540df1e21f95dad834b70334f61549c667271dc654d846591f72f3bf57996e82b1875625c9576cac71c3acf32b4e3c + languageName: node + linkType: hard + "@sideway/address@npm:^4.1.5": version: 4.1.5 resolution: "@sideway/address@npm:4.1.5" @@ -10539,6 +10939,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.24.1": + version: 0.24.51 + resolution: "@sinclair/typebox@npm:0.24.51" + checksum: 10c0/458131e83ca59ad3721f0abeef2aa5220aff2083767e1143d75c67c85d55ef7a212f48f394471ee6bdd2e860ba30f09a489cdd2a28a2824d5b0d1014bdfb2552 + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -13579,7 +13986,7 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:0.5.15": +"@swc/helpers@npm:0.5.15, @swc/helpers@npm:^0.5.15": version: 0.5.15 resolution: "@swc/helpers@npm:0.5.15" dependencies: @@ -15926,7 +16333,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.11.0, ajv@npm:^8.12.0, ajv@npm:^8.6.3, ajv@npm:^8.9.0": +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.12.0, ajv@npm:^8.6.3, ajv@npm:^8.9.0": version: 8.17.1 resolution: "ajv@npm:8.17.1" dependencies: @@ -16664,6 +17071,16 @@ __metadata: languageName: node linkType: hard +"avvio@npm:^8.3.0": + version: 8.4.0 + resolution: "avvio@npm:8.4.0" + dependencies: + "@fastify/error": "npm:^3.3.0" + fastq: "npm:^1.17.1" + checksum: 10c0/bea7f28e38b57755786852226f380ea087d572f8bbcfe14b59d1239551ef89cecc40229a6ac85e17af44c81a481d03280576586385e93d76bb9f2c5bc75c6067 + languageName: node + linkType: hard + "avvio@npm:^9.0.0": version: 9.1.0 resolution: "avvio@npm:9.1.0" @@ -16772,6 +17189,19 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:^9.2.1": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" + dependencies: + find-cache-dir: "npm:^4.0.0" + schema-utils: "npm:^4.0.0" + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: 10c0/efb82faff4c7c27e9c15bb28bf11c73200e61cf365118a9514e8d74dd489d0afc2a0d5aaa62cb4254eefc2ab631579224d95a03fd245410f28ea75e24de54ba4 + languageName: node + linkType: hard + "babel-plugin-add-react-displayname@npm:^0.0.5": version: 0.0.5 resolution: "babel-plugin-add-react-displayname@npm:0.0.5" @@ -16933,6 +17363,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:^0.26.0": + version: 0.26.0 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.26.0" + dependencies: + hermes-parser: "npm:0.26.0" + checksum: 10c0/b93e74450b0e1a906d316697b49c477ddd790e9c62b8bd4de259b553eef1b33b98e0453b72a3ecec242cb3d61766c65eae7e874070e307ac91629d3b8951174a + languageName: node + linkType: hard + "babel-plugin-syntax-trailing-function-commas@npm:^7.0.0-beta.0": version: 7.0.0-beta.0 resolution: "babel-plugin-syntax-trailing-function-commas@npm:7.0.0-beta.0" @@ -17916,6 +18355,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001616": + version: 1.0.30001699 + resolution: "caniuse-lite@npm:1.0.30001699" + checksum: 10c0/e87b3a0602c3124131f6a21f1eb262378e17a2ee3089e3c472ac8b9caa85cf7d6a219655379302c29c6f10a74051f2a712639d7f98ee0444c73fefcbaf25d519 + languageName: node + linkType: hard + "caniuse-lite@npm:^1.0.30001669": version: 1.0.30001672 resolution: "caniuse-lite@npm:1.0.30001672" @@ -18754,6 +19200,13 @@ __metadata: languageName: node linkType: hard +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + "common-tags@npm:1.8.2": version: 1.8.2 resolution: "common-tags@npm:1.8.2" @@ -19000,6 +19453,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:^0.7.0": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 + languageName: node + linkType: hard + "cookie@npm:^1.0.0": version: 1.0.2 resolution: "cookie@npm:1.0.2" @@ -21938,6 +22398,13 @@ __metadata: languageName: node linkType: hard +"estree-util-is-identifier-name@npm:^1.1.0": + version: 1.1.0 + resolution: "estree-util-is-identifier-name@npm:1.1.0" + checksum: 10c0/4984c705638594d651ea090b3da8c0726da67790cea661dd56540e0f16e1bb07fb0c3a96b8f8cd625d5d28da3184340ffd815fea82cb130dc3d558db023b508c + languageName: node + linkType: hard + "estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" @@ -22001,7 +22468,7 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.0.0, events@npm:^3.2.0": +"events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 @@ -22255,6 +22722,13 @@ __metadata: languageName: node linkType: hard +"fast-content-type-parse@npm:^1.1.0": + version: 1.1.0 + resolution: "fast-content-type-parse@npm:1.1.0" + checksum: 10c0/882bf990fa5d64be1825ce183818db43900ece0d7ef184cb9409bae8ed1001acbe536a657b1496382cb3e308e71ab39cc399bbdae70cba1745eecaeca4e55384 + languageName: node + linkType: hard + "fast-decode-uri-component@npm:^1.0.1": version: 1.0.1 resolution: "fast-decode-uri-component@npm:1.0.1" @@ -22351,6 +22825,21 @@ __metadata: languageName: node linkType: hard +"fast-json-stringify@npm:^5.7.0, fast-json-stringify@npm:^5.8.0": + version: 5.16.1 + resolution: "fast-json-stringify@npm:5.16.1" + dependencies: + "@fastify/merge-json-schemas": "npm:^0.1.0" + ajv: "npm:^8.10.0" + ajv-formats: "npm:^3.0.1" + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^2.1.0" + json-schema-ref-resolver: "npm:^1.0.1" + rfdc: "npm:^1.2.0" + checksum: 10c0/bbf955d9912fb827dff0e097fdbff3c11aec540ea8019a19593a16224cac70d49d0cebd98e412843fc72259184f73a78a45e63040d3c44349f4735a492f2f1a4 + languageName: node + linkType: hard + "fast-json-stringify@npm:^6.0.0": version: 6.0.0 resolution: "fast-json-stringify@npm:6.0.0" @@ -22415,7 +22904,7 @@ __metadata: languageName: node linkType: hard -"fast-uri@npm:^2.3.0": +"fast-uri@npm:^2.0.0, fast-uri@npm:^2.1.0, fast-uri@npm:^2.3.0": version: 2.4.0 resolution: "fast-uri@npm:2.4.0" checksum: 10c0/300453cfe2f7d5ec16be0f2c8dc5b280edbaca59440b2deb4ab56ac0f584637179e9ee7539d0b70ef0fce9608245ebfa75307c84fa4829b1065c3b7ef7dcf706 @@ -22469,7 +22958,16 @@ __metadata: languageName: node linkType: hard -"fastify-plugin@npm:^4.4.0": +"fastify-favicon@npm:^4.3.0": + version: 4.3.0 + resolution: "fastify-favicon@npm:4.3.0" + dependencies: + fastify-plugin: "npm:^4.5.0" + checksum: 10c0/e5ccff6acbcb2e41b36d4fb9f28df9cc9a71e231dc019e3dc2e04badc3129319f3acc8fa573824a86567950abfde6355bce192839eb3eae4f0f72331d65ea308 + languageName: node + linkType: hard + +"fastify-plugin@npm:^4.0.0, fastify-plugin@npm:^4.4.0, fastify-plugin@npm:^4.5.0, fastify-plugin@npm:^4.5.1": version: 4.5.1 resolution: "fastify-plugin@npm:4.5.1" checksum: 10c0/f58f79cd9d3c88fd7f79a3270276c6339fc57bbe72ef14d20b73779193c404e317ac18e8eae2c5071b3909ebee45d7eb6871da4e65464ac64ed0d9746b4e9b9f @@ -22518,6 +23016,30 @@ __metadata: languageName: node linkType: hard +"fastify@npm:^4.24.3": + version: 4.29.0 + resolution: "fastify@npm:4.29.0" + dependencies: + "@fastify/ajv-compiler": "npm:^3.5.0" + "@fastify/error": "npm:^3.4.0" + "@fastify/fast-json-stringify-compiler": "npm:^4.3.0" + abstract-logging: "npm:^2.0.1" + avvio: "npm:^8.3.0" + fast-content-type-parse: "npm:^1.1.0" + fast-json-stringify: "npm:^5.8.0" + find-my-way: "npm:^8.0.0" + light-my-request: "npm:^5.11.0" + pino: "npm:^9.0.0" + process-warning: "npm:^3.0.0" + proxy-addr: "npm:^2.0.7" + rfdc: "npm:^1.3.0" + secure-json-parse: "npm:^2.7.0" + semver: "npm:^7.5.4" + toad-cache: "npm:^3.3.0" + checksum: 10c0/8bfdac5c4be943c57dfcc8d16b400f11a9bc8d4f096b4b28b06c9bb85ffedae1e5ec7a00eaa736813ebe075aa79f72a4b10d9744013229dd7cd3922c605e8e1f + languageName: node + linkType: hard + "fastparallel@npm:^2.2.0": version: 2.4.1 resolution: "fastparallel@npm:2.4.1" @@ -22798,6 +23320,27 @@ __metadata: languageName: node linkType: hard +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" + dependencies: + common-path-prefix: "npm:^3.0.0" + pkg-dir: "npm:^7.0.0" + checksum: 10c0/0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff + languageName: node + linkType: hard + +"find-my-way@npm:^8.0.0": + version: 8.2.2 + resolution: "find-my-way@npm:8.2.2" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-querystring: "npm:^1.0.0" + safe-regex2: "npm:^3.1.0" + checksum: 10c0/ce462b2033e08a82fa79b837e4ef9e637d5f3e6763564631ad835b4e50b22e2123c0bf27c4fe6b02bc4006cd7949c0351d2b6b6f32248e839b10bdcbd3a3269f + languageName: node + linkType: hard + "find-my-way@npm:^9.0.0": version: 9.1.0 resolution: "find-my-way@npm:9.1.0" @@ -22855,6 +23398,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + "find-yarn-workspace-root@npm:^2.0.0": version: 2.0.0 resolution: "find-yarn-workspace-root@npm:2.0.0" @@ -22976,6 +23529,20 @@ __metadata: languageName: node linkType: hard +"flow-remove-types@npm:^2.250.0": + version: 2.259.1 + resolution: "flow-remove-types@npm:2.259.1" + dependencies: + hermes-parser: "npm:0.25.1" + pirates: "npm:^3.0.2" + vlq: "npm:^0.2.1" + bin: + flow-node: flow-node + flow-remove-types: flow-remove-types + checksum: 10c0/412bc54c76b649ba0528fbff914a7b672c58f6831ca4dc4ba8233f625ce9bcf593869da18c8d19d7662586752667e9394332ed2ad956e6a5297a62d013404441 + languageName: node + linkType: hard + "flush-write-stream@npm:^1.0.0": version: 1.1.1 resolution: "flush-write-stream@npm:1.1.1" @@ -23153,7 +23720,7 @@ __metadata: languageName: node linkType: hard -"forwarded@npm:0.2.0": +"forwarded@npm:0.2.0, forwarded@npm:^0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 @@ -24406,6 +24973,20 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.25.1": + version: 0.25.1 + resolution: "hermes-estree@npm:0.25.1" + checksum: 10c0/48be3b2fa37a0cbc77a112a89096fa212f25d06de92781b163d67853d210a8a5c3784fac23d7d48335058f7ed283115c87b4332c2a2abaaccc76d0ead1a282ac + languageName: node + linkType: hard + +"hermes-estree@npm:0.26.0": + version: 0.26.0 + resolution: "hermes-estree@npm:0.26.0" + checksum: 10c0/4bf734b0ae484f654724f114939d349b39afe81af0f255b2e15d0fecfe2fd122f36f0b65893e936336e1a4cc77e4124ca962d054a17519f33036e20706a5386d + languageName: node + linkType: hard + "hermes-parser@npm:0.22.0": version: 0.22.0 resolution: "hermes-parser@npm:0.22.0" @@ -24424,6 +25005,24 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.25.1": + version: 0.25.1 + resolution: "hermes-parser@npm:0.25.1" + dependencies: + hermes-estree: "npm:0.25.1" + checksum: 10c0/3abaa4c6f1bcc25273f267297a89a4904963ea29af19b8e4f6eabe04f1c2c7e9abd7bfc4730ddb1d58f2ea04b6fee74053d8bddb5656ec6ebf6c79cc8d14202c + languageName: node + linkType: hard + +"hermes-parser@npm:0.26.0": + version: 0.26.0 + resolution: "hermes-parser@npm:0.26.0" + dependencies: + hermes-estree: "npm:0.26.0" + checksum: 10c0/8c6340a52a10ac59ff7ab6c48a9cf09a3752d1707f8dc8962f8309da5edddf6e1dd1f403f01c85103908c74232368a8db9e076615adec925f781a0e918ec85f4 + languageName: node + linkType: hard + "hexoid@npm:^1.0.0": version: 1.0.0 resolution: "hexoid@npm:1.0.0" @@ -24786,6 +25385,13 @@ __metadata: languageName: node linkType: hard +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 10c0/885ba3177c7181d315a856ee9c0005ff8eb5dcb1ce9e9d61be70987895d934d84686c37c981cceeb53216d4c9c15c1cc25f1804e84cc6a74a16993c5d7fd0893 + languageName: node + linkType: hard + "hyphenate-style-name@npm:^1.0.3": version: 1.1.0 resolution: "hyphenate-style-name@npm:1.1.0" @@ -24882,6 +25488,17 @@ __metadata: languageName: node linkType: hard +"image-size@npm:^1.1.1": + version: 1.2.0 + resolution: "image-size@npm:1.2.0" + dependencies: + queue: "npm:6.0.2" + bin: + image-size: bin/image-size.js + checksum: 10c0/782669b530d9bbdcb334c8451db5f104dfbbcf90940751e6b75ba4e1b86d98bf3127c339eac8fb7a25c7a9ec4ea868d27b4916df3943c269b7419a8cc4459dca + languageName: node + linkType: hard + "image-size@npm:~0.5.0": version: 0.5.5 resolution: "image-size@npm:0.5.5" @@ -26025,6 +26642,13 @@ __metadata: languageName: node linkType: hard +"isomorphic-rslog@npm:0.0.6": + version: 0.0.6 + resolution: "isomorphic-rslog@npm:0.0.6" + checksum: 10c0/ff702859d804ca13d5ed9f7de1d09a2bcfdb8e1dc8712713c569ea1833ecde1dcd1443057234d61ded22466f1775a2a94c6659d358678343f1efff0b5869e048 + languageName: node + linkType: hard + "isomorphic-unfetch@npm:^3.1.0": version: 3.1.0 resolution: "isomorphic-unfetch@npm:3.1.0" @@ -27067,7 +27691,7 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:^9.0.0": +"jsonwebtoken@npm:^9.0.0, jsonwebtoken@npm:^9.0.2": version: 9.0.2 resolution: "jsonwebtoken@npm:9.0.2" dependencies: @@ -27399,6 +28023,17 @@ __metadata: languageName: node linkType: hard +"light-my-request@npm:^5.11.0": + version: 5.14.0 + resolution: "light-my-request@npm:5.14.0" + dependencies: + cookie: "npm:^0.7.0" + process-warning: "npm:^3.0.0" + set-cookie-parser: "npm:^2.4.1" + checksum: 10c0/5ec3af15010156d2821469d17910e0a3071c3269a8d5ffc3180fd761ffc91649ec1f9b2aaf7b5b6d44825e1038e6c07fdba247b93370186f3af9dbb94e11c0b5 + languageName: node + linkType: hard + "light-my-request@npm:^6.0.0": version: 6.3.0 resolution: "light-my-request@npm:6.3.0" @@ -27594,6 +28229,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -28243,6 +28887,18 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^4.11.1": + version: 4.17.0 + resolution: "memfs@npm:4.17.0" + dependencies: + "@jsonjoy.com/json-pack": "npm:^1.0.3" + "@jsonjoy.com/util": "npm:^1.3.0" + tree-dump: "npm:^1.0.1" + tslib: "npm:^2.0.0" + checksum: 10c0/2901f69e80e1fbefa8aafe994a253fff6f34eb176d8b80d57476311611e516a11ab4dd93f852c8739fe04f2b57d6a4ca7a1828fa0bd401ce631bcac214b3d58b + languageName: node + linkType: hard + "memoize-one@npm:^5.0.0, memoize-one@npm:^5.2.1": version: 5.2.1 resolution: "memoize-one@npm:5.2.1" @@ -28793,7 +29449,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:2.1.35, mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.30, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:2.1.35, mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.30, mime-types@npm:^2.1.35, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -29914,6 +30570,13 @@ __metadata: languageName: node linkType: hard +"node-modules-regexp@npm:^1.0.0": + version: 1.0.0 + resolution: "node-modules-regexp@npm:1.0.0" + checksum: 10c0/d4a9b6425a18e9fadd38f21a7f7820b3bfda4663c7d3b9f80043e3f5f7e27a0a1e04f524077b00a15ae77148cd81319da5772900229d89541062f7e876b36763 + languageName: node + linkType: hard + "node-releases@npm:^2.0.18": version: 2.0.18 resolution: "node-releases@npm:2.0.18" @@ -30696,6 +31359,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + "p-locate@npm:^3.0.0": version: 3.0.0 resolution: "p-locate@npm:3.0.0" @@ -30723,6 +31395,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: "npm:^4.0.0" + checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + "p-map@npm:^2.0.0": version: 2.1.0 resolution: "p-map@npm:2.1.0" @@ -31136,6 +31817,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -31214,6 +31902,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^6.3.0": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10c0/73b67f4638b41cde56254e6354e46ae3a2ebc08279583f6af3d96fe4664fc75788f74ed0d18ca44fa4a98491b69434f9eee73b97bb5314bd1b5adb700f5c18d6 + languageName: node + linkType: hard + "path-type@npm:^1.0.0": version: 1.1.0 resolution: "path-type@npm:1.1.0" @@ -31419,6 +32114,15 @@ __metadata: languageName: node linkType: hard +"pirates@npm:^3.0.2": + version: 3.0.2 + resolution: "pirates@npm:3.0.2" + dependencies: + node-modules-regexp: "npm:^1.0.0" + checksum: 10c0/f71519f64abff750ad00398e7a0f724e7d3af0ce14c0cf149a47dd9e1fae5e9aea24cb3a63b4ce8dce8b051f7d44531af6743078e33f72cb8602c5a7365185d1 + languageName: node + linkType: hard + "pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.6": version: 4.0.6 resolution: "pirates@npm:4.0.6" @@ -31453,6 +32157,15 @@ __metadata: languageName: node linkType: hard +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" + dependencies: + find-up: "npm:^6.3.0" + checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 + languageName: node + linkType: hard + "pkg-up@npm:^3.1.0": version: 3.1.0 resolution: "pkg-up@npm:3.1.0" @@ -31928,6 +32641,18 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^28.1.0": + version: 28.1.3 + resolution: "pretty-format@npm:28.1.3" + dependencies: + "@jest/schemas": "npm:^28.1.3" + ansi-regex: "npm:^5.0.1" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10c0/596d8b459b6fdac7dcbd70d40169191e889939c17ffbcc73eebe2a9a6f82cdbb57faffe190274e0a507d9ecdf3affadf8a9b43442a625eecfbd2813b9319660f + languageName: node + linkType: hard + "pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" @@ -31982,6 +32707,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^3.0.0": + version: 3.0.0 + resolution: "process-warning@npm:3.0.0" + checksum: 10c0/60f3c8ddee586f0706c1e6cb5aa9c86df05774b9330d792d7c8851cf0031afd759d665404d07037e0b4901b55c44a423f07bdc465c63de07d8d23196bb403622 + languageName: node + linkType: hard + "process-warning@npm:^4.0.0": version: 4.0.0 resolution: "process-warning@npm:4.0.0" @@ -34069,6 +34801,13 @@ __metadata: languageName: node linkType: hard +"ret@npm:~0.4.0": + version: 0.4.3 + resolution: "ret@npm:0.4.3" + checksum: 10c0/93e4e81cf393ebbafa1a26816e0b22ad0e2539c10e267d46ce8754c3f385b7aa839772ee1f83fdd2487b43d1081f29af41a19160e85456311f6f1778e14ba66b + languageName: node + linkType: hard + "ret@npm:~0.5.0": version: 0.5.0 resolution: "ret@npm:0.5.0" @@ -34465,6 +35204,15 @@ __metadata: languageName: node linkType: hard +"safe-regex2@npm:^3.1.0": + version: 3.1.0 + resolution: "safe-regex2@npm:3.1.0" + dependencies: + ret: "npm:~0.4.0" + checksum: 10c0/5e5e7f9f116ddfd324b1fdc65ad4470937eebc8883d34669ce8c5afbda64f1954e5e4c2e754ef6281e5f6762e0b8c4e20fb9eec4d47355526f8cc1f6a9764624 + languageName: node + linkType: hard + "safe-regex2@npm:^4.0.0": version: 4.0.0 resolution: "safe-regex2@npm:4.0.0" @@ -34631,6 +35379,18 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^4.0.0": + version: 4.3.0 + resolution: "schema-utils@npm:4.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 10c0/c23f0fa73ef71a01d4a2bb7af4c91e0d356ec640e071aa2d06ea5e67f042962bb7ac7c29a60a295bb0125878801bc3209197a2b8a833dd25bd38e37c3ed21427 + languageName: node + linkType: hard + "schema-utils@npm:^4.2.0": version: 4.2.0 resolution: "schema-utils@npm:4.2.0" @@ -34892,7 +35652,7 @@ __metadata: languageName: node linkType: hard -"set-cookie-parser@npm:^2.6.0": +"set-cookie-parser@npm:^2.4.1, set-cookie-parser@npm:^2.6.0": version: 2.7.1 resolution: "set-cookie-parser@npm:2.7.1" checksum: 10c0/060c198c4c92547ac15988256f445eae523f57f2ceefeccf52d30d75dedf6bff22b9c26f756bd44e8e560d44ff4ab2130b178bd2e52ef5571bf7be3bd7632d9a @@ -34982,6 +35742,13 @@ __metadata: languageName: node linkType: hard +"shallowequal@npm:^1.1.0": + version: 1.1.0 + resolution: "shallowequal@npm:1.1.0" + checksum: 10c0/b926efb51cd0f47aa9bc061add788a4a650550bbe50647962113a4579b60af2abe7b62f9b02314acc6f97151d4cf87033a2b15fc20852fae306d1a095215396c + languageName: node + linkType: hard + "sharp@npm:0.33.5, sharp@npm:^0.33.5": version: 0.33.5 resolution: "sharp@npm:0.33.5" @@ -35501,7 +36268,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.7.3": +"source-map@npm:^0.7.3, source-map@npm:^0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc @@ -36870,6 +37637,15 @@ __metadata: languageName: node linkType: hard +"thingies@npm:^1.20.0": + version: 1.21.0 + resolution: "thingies@npm:1.21.0" + peerDependencies: + tslib: ^2 + checksum: 10c0/7570ee855aecb73185a672ecf3eb1c287a6512bf5476449388433b2d4debcf78100bc8bfd439b0edd38d2bc3bfb8341de5ce85b8557dec66d0f27b962c9a8bc1 + languageName: node + linkType: hard + "thread-stream@npm:^3.0.0": version: 3.1.0 resolution: "thread-stream@npm:3.1.0" @@ -36886,6 +37662,13 @@ __metadata: languageName: node linkType: hard +"throttleit@npm:^2.1.0": + version: 2.1.0 + resolution: "throttleit@npm:2.1.0" + checksum: 10c0/1696ae849522cea6ba4f4f3beac1f6655d335e51b42d99215e196a718adced0069e48deaaf77f7e89f526ab31de5b5c91016027da182438e6f9280be2f3d5265 + languageName: node + linkType: hard + "through2@npm:^2.0.0, through2@npm:^2.0.1": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -37031,7 +37814,7 @@ __metadata: languageName: node linkType: hard -"toad-cache@npm:^3.7.0": +"toad-cache@npm:^3.3.0, toad-cache@npm:^3.7.0": version: 3.7.0 resolution: "toad-cache@npm:3.7.0" checksum: 10c0/7dae2782ee20b22c9798bb8b71dec7ec6a0091021d2ea9dd6e8afccab6b65b358fdba49a02209fac574499702e2c000660721516c87c2538d1b2c0ba03e8c0c3 @@ -37061,6 +37844,15 @@ __metadata: languageName: node linkType: hard +"tree-dump@npm:^1.0.1": + version: 1.0.2 + resolution: "tree-dump@npm:1.0.2" + peerDependencies: + tslib: 2 + checksum: 10c0/d1d180764e9c691b28332dbd74226c6b6af361dfb1e134bb11e60e17cb11c215894adee50ffc578da5dcf546006693947be8b6665eb1269b56e2f534926f1c1f + languageName: node + linkType: hard + "tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -37519,7 +38311,7 @@ __metadata: languageName: node linkType: hard -"type-is@npm:~1.6.18": +"type-is@npm:^1.6.18, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: @@ -38351,7 +39143,7 @@ __metadata: languageName: node linkType: hard -"vary@npm:^1, vary@npm:~1.1.2": +"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f @@ -38410,6 +39202,13 @@ __metadata: languageName: node linkType: hard +"vlq@npm:^0.2.1": + version: 0.2.3 + resolution: "vlq@npm:0.2.3" + checksum: 10c0/d1557b404353ca75c7affaaf403d245a3273a7d1c6b3380ed7f04ae3f080e4658f41ac700d6f48acb3cd4875fe7bc7da4924b3572cd5584a5de83b35b1de5e12 + languageName: node + linkType: hard + "vlq@npm:^1.0.0": version: 1.0.1 resolution: "vlq@npm:1.0.1" @@ -39074,7 +39873,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.12.0, ws@npm:^8.18.0, ws@npm:^8.2.3": +"ws@npm:^8.12.0, ws@npm:^8.18.0, ws@npm:^8.2.3, ws@npm:^8.7.0": version: 8.18.0 resolution: "ws@npm:8.18.0" peerDependencies: @@ -39371,6 +40170,13 @@ __metadata: languageName: node linkType: hard +"yocto-queue@npm:^1.0.0": + version: 1.1.1 + resolution: "yocto-queue@npm:1.1.1" + checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 + languageName: node + linkType: hard + "zen-observable-ts@npm:^1.2.5": version: 1.2.5 resolution: "zen-observable-ts@npm:1.2.5"