| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import 'package:app_state/app_state.dart'; |
| import 'package:playground_components/playground_components.dart'; |
| |
| import '../../modules/examples/models/example_loading_descriptors/examples_loading_descriptor_factory.dart'; |
| import '../../constants/params.dart'; |
| import '../../utils/bool.dart'; |
| import 'page.dart'; |
| |
| const _basePath = '/embedded'; |
| |
| /// A path to load multiple examples immediately. |
| /// |
| /// This object is parsed from a URL that loads multiple specific examples, |
| /// most likely one per SDK. |
| class EmbeddedPlaygroundMultiplePath extends PagePath { |
| final ExamplesLoadingDescriptor descriptor; |
| final bool isEditable; |
| |
| EmbeddedPlaygroundMultiplePath({ |
| required this.descriptor, |
| required this.isEditable, |
| }) : super( |
| key: EmbeddedPlaygroundPage.classFactoryKey, |
| state: { |
| kDescriptorParam: descriptor.toJson(), |
| EmbeddedPlaygroundPage.isEditableParam: isEditable.toIntString(), |
| }, |
| ); |
| |
| static EmbeddedPlaygroundMultiplePath? tryParse(Uri uri) { |
| if (uri.path != _basePath) { |
| return null; |
| } |
| |
| final descriptor = |
| ExamplesLoadingDescriptorFactory.tryParseOfMultipleExamples( |
| uri.queryParameters, |
| ); |
| |
| if (descriptor == null) { |
| return null; |
| } |
| |
| return EmbeddedPlaygroundMultiplePath( |
| descriptor: _addLazyLoad(descriptor), |
| isEditable: _getIsEditable(uri.queryParameters), |
| ); |
| } |
| |
| @override |
| String get location { |
| final params = descriptor.toJson(); |
| |
| if (!isEditable) { |
| params[EmbeddedPlaygroundPage.isEditableParam] = isEditable.toIntString(); |
| } |
| |
| return Uri( |
| path: _basePath, |
| queryParameters: params, |
| ).toString(); |
| } |
| } |
| |
| /// A path to load a single example. |
| /// |
| /// This class is used to emit a URL of any currently selected example. |
| class EmbeddedPlaygroundSinglePath extends PagePath { |
| final ExampleLoadingDescriptor descriptor; |
| final bool isEditable; |
| |
| EmbeddedPlaygroundSinglePath({ |
| required this.descriptor, |
| required this.isEditable, |
| super.state, |
| }) : super( |
| factoryKey: EmbeddedPlaygroundPage.classFactoryKey, |
| ); |
| |
| @override |
| String get location { |
| final params = descriptor.toJson(); |
| |
| if (!isEditable) { |
| params[EmbeddedPlaygroundPage.isEditableParam] = isEditable.toIntString(); |
| } |
| |
| return Uri( |
| path: _basePath, |
| queryParameters: params.map((k, v) => MapEntry(k, v.toString())), |
| ).toString(); |
| } |
| } |
| |
| /// A path to load a single example and possibly others with lazy-load. |
| /// |
| /// This object is parsed from a URL that loads a single specific example. |
| /// It adds instructions to lazily load default examples for other SDKs. |
| class EmbeddedPlaygroundSingleFirstPath extends EmbeddedPlaygroundSinglePath { |
| final ExamplesLoadingDescriptor multipleDescriptor; |
| |
| EmbeddedPlaygroundSingleFirstPath({ |
| required super.descriptor, |
| required super.isEditable, |
| required this.multipleDescriptor, |
| }) : super( |
| state: { |
| kDescriptorParam: multipleDescriptor.toJson(), |
| }, |
| ); |
| |
| factory EmbeddedPlaygroundSingleFirstPath.fromMultiple({ |
| required ExamplesLoadingDescriptor multipleDescriptor, |
| required bool isEditable, |
| }) { |
| return EmbeddedPlaygroundSingleFirstPath( |
| descriptor: multipleDescriptor.descriptors.first, |
| isEditable: isEditable, |
| multipleDescriptor: multipleDescriptor, |
| ); |
| } |
| |
| static EmbeddedPlaygroundSinglePath? tryParse(Uri uri) { |
| if (uri.path != _basePath) { |
| return null; |
| } |
| |
| final descriptor = ExamplesLoadingDescriptorFactory.tryParseOfSingleExample( |
| uri.queryParameters, |
| ); |
| |
| if (descriptor == null) { |
| return null; |
| } |
| |
| return EmbeddedPlaygroundSingleFirstPath.fromMultiple( |
| multipleDescriptor: _addLazyLoad(descriptor), |
| isEditable: _getIsEditable(uri.queryParameters), |
| ); |
| } |
| } |
| |
| /// A path to load an empty example for each SDK. |
| class EmbeddedPlaygroundEmptyPath extends PagePath { |
| static EmbeddedPlaygroundSingleFirstPath? tryParse(Uri uri) { |
| if (uri.path != _basePath) { |
| return null; |
| } |
| |
| final descriptor = ExamplesLoadingDescriptorFactory.getEmptyForSdk( |
| uri.queryParameters, |
| ); |
| |
| return EmbeddedPlaygroundSingleFirstPath.fromMultiple( |
| multipleDescriptor: _addLazyLoad(descriptor), |
| isEditable: _getIsEditable(uri.queryParameters), |
| ); |
| } |
| } |
| |
| bool _getIsEditable(Map<String, String> params) { |
| final value = params[EmbeddedPlaygroundPage.isEditableParam]; |
| return BoolExtension.tryParseIntString(value) ?? true; |
| } |
| |
| ExamplesLoadingDescriptor _addLazyLoad(ExamplesLoadingDescriptor descriptor) { |
| return descriptor.copyWithMissingLazy( |
| ExamplesLoadingDescriptorFactory.defaultLazyLoadDescriptors, |
| ); |
| } |