initial commit
|
|
@ -0,0 +1,44 @@
|
|||
# Miscellaneous
|
||||
*.class
|
||||
*.log
|
||||
*.pyc
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
migrate_working_dir/
|
||||
|
||||
# IntelliJ related
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/
|
||||
|
||||
# The .vscode folder contains launch configuration and tasks you configure in
|
||||
# VS Code which you may wish to be included in version control, so this line
|
||||
# is commented out by default.
|
||||
#.vscode/
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
**/doc/api/
|
||||
**/ios/Flutter/.last_build_id
|
||||
.dart_tool/
|
||||
.flutter-plugins
|
||||
.flutter-plugins-dependencies
|
||||
.packages
|
||||
.pub-cache/
|
||||
.pub/
|
||||
/build/
|
||||
|
||||
# Symbolication related
|
||||
app.*.symbols
|
||||
|
||||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
# This file tracks properties of this Flutter project.
|
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||
#
|
||||
# This file should be version controlled.
|
||||
|
||||
version:
|
||||
revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
channel: stable
|
||||
|
||||
project_type: app
|
||||
|
||||
# Tracks metadata for the flutter migrate command
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: android
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: ios
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: linux
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: macos
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: web
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: windows
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
|
||||
# User provided section
|
||||
|
||||
# List of Local paths (relative to this file) that should be
|
||||
# ignored by the migrate tool.
|
||||
#
|
||||
# Files that are not part of the templates will be ignored by default.
|
||||
unmanaged_files:
|
||||
- 'lib/main.dart'
|
||||
- 'ios/Runner.xcodeproj/project.pbxproj'
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
# This file configures the analyzer, which statically analyzes Dart code to
|
||||
# check for errors, warnings, and lints.
|
||||
#
|
||||
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
||||
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
||||
# invoked from the command line by running `flutter analyze`.
|
||||
|
||||
# The following line activates a set of recommended lints for Flutter apps,
|
||||
# packages, and plugins designed to encourage good coding practices.
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
linter:
|
||||
# The lint rules applied to this project can be customized in the
|
||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||
# included above or to enable additional rules. A list of all available lints
|
||||
# and their documentation is published at
|
||||
# https://dart-lang.github.io/linter/lints/index.html.
|
||||
#
|
||||
# Instead of disabling a lint rule for the entire project in the
|
||||
# section below, it can also be suppressed for a single line of code
|
||||
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||
# producing the lint.
|
||||
rules:
|
||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
gradle-wrapper.jar
|
||||
/.gradle
|
||||
/captures/
|
||||
/gradlew
|
||||
/gradlew.bat
|
||||
/local.properties
|
||||
GeneratedPluginRegistrant.java
|
||||
|
||||
# Remember to never publicly share your keystore.
|
||||
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||
key.properties
|
||||
**/*.keystore
|
||||
**/*.jks
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
if (localPropertiesFile.exists()) {
|
||||
localPropertiesFile.withReader('UTF-8') { reader ->
|
||||
localProperties.load(reader)
|
||||
}
|
||||
}
|
||||
|
||||
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
||||
if (flutterRoot == null) {
|
||||
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
||||
}
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||
if (flutterVersionCode == null) {
|
||||
flutterVersionCode = '1'
|
||||
}
|
||||
|
||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||
if (flutterVersionName == null) {
|
||||
flutterVersionName = '1.0'
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||
|
||||
android {
|
||||
compileSdkVersion flutter.compileSdkVersion
|
||||
ndkVersion flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.example.sapaly_shop"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
minSdkVersion flutter.minSdkVersion
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
// TODO: Add your own signing config for the release build.
|
||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||
signingConfig signingConfigs.debug
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.sapaly_shop">
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
the Flutter tool needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.sapaly_shop">
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<data android:scheme="https" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.DIAL" />
|
||||
<data android:scheme="tel" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<data android:mimeType="*/*" />
|
||||
</intent>
|
||||
</queries>
|
||||
<application
|
||||
android:label="sapaly_shop"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||
the Android process has started. This theme is visible to the user
|
||||
while the Flutter UI initializes. After that, this theme continues
|
||||
to determine the Window background behind the Flutter UI. -->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.NormalTheme"
|
||||
android:resource="@style/NormalTheme"
|
||||
/>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
<meta-data
|
||||
android:name="flutterEmbedding"
|
||||
android:value="2" />
|
||||
</application>
|
||||
</manifest>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package com.example.sapaly_shop
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
class MainActivity: FlutterActivity() {
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="?android:colorBackground" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@android:color/white" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
||||
|
After Width: | Height: | Size: 544 B |
|
After Width: | Height: | Size: 442 B |
|
After Width: | Height: | Size: 721 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.sapaly_shop">
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
the Flutter tool needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
buildscript {
|
||||
ext.kotlin_version = '1.7.10'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.2.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.buildDir = '../build'
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
org.gradle.jvmargs=-Xmx1536M
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
include ':app'
|
||||
|
||||
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
|
||||
def properties = new Properties()
|
||||
|
||||
assert localPropertiesFile.exists()
|
||||
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
|
||||
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.1307 13.4702H5.38246L2.51533 0.776855H0.795044M3.08875 3.19463H16.851L15.1307 11.0524H4.80903L3.08875 3.19463Z" stroke="#4B4B4B" stroke-width="1.4592" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M13.9839 17.0969C14.6173 17.0969 15.1307 16.5556 15.1307 15.888C15.1307 15.2203 14.6173 14.6791 13.9839 14.6791C13.3505 14.6791 12.837 15.2203 12.837 15.888C12.837 16.5556 13.3505 17.0969 13.9839 17.0969Z" stroke="#4B4B4B" stroke-width="1.4592" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6.52942 17.0969C7.16281 17.0969 7.67628 16.5556 7.67628 15.888C7.67628 15.2203 7.16281 14.6791 6.52942 14.6791C5.89603 14.6791 5.38257 15.2203 5.38257 15.888C5.38257 16.5556 5.89603 17.0969 6.52942 17.0969Z" stroke="#4B4B4B" stroke-width="1.4592" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 925 B |
|
|
@ -0,0 +1,22 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_222_18500)">
|
||||
<g filter="url(#filter0_d_222_18500)">
|
||||
<path d="M28.8 14.96L22.6666 10.0267V6.66667C22.6993 5.99326 22.4636 5.33438 22.0112 4.83449C21.5588 4.3346 20.9266 4.03451 20.2533 4H5.05331C4.38473 4.04128 3.75934 4.34431 3.31261 4.84344C2.86589 5.34258 2.6338 5.99762 2.66664 6.66667V20C2.65426 20.5295 2.79983 21.0506 3.08478 21.4971C3.36974 21.9435 3.78117 22.295 4.26664 22.5067C4.02108 23.1074 3.92538 23.7589 3.98779 24.4048C4.0502 25.0508 4.26885 25.6719 4.62487 26.2145C4.98089 26.7571 5.46358 27.2049 6.03131 27.5193C6.59903 27.8338 7.23473 28.0053 7.88356 28.0192C8.53239 28.0331 9.17486 27.889 9.75553 27.5991C10.3362 27.3093 10.8376 26.8826 11.2166 26.3557C11.5955 25.8289 11.8406 25.2177 11.9306 24.575C12.0206 23.9323 11.9529 23.2774 11.7333 22.6667H20.2133C19.994 23.2708 19.9236 23.919 20.0079 24.5561C20.0922 25.1933 20.3288 25.8008 20.6977 26.3271C21.0666 26.8535 21.5569 27.2832 22.1271 27.5798C22.6973 27.8765 23.3306 28.0314 23.9733 28.0314C24.616 28.0314 25.2493 27.8765 25.8195 27.5798C26.3897 27.2832 26.88 26.8535 27.2489 26.3271C27.6178 25.8008 27.8544 25.1933 27.9387 24.5561C28.0231 23.919 27.9526 23.2708 27.7333 22.6667H28C28.3536 22.6667 28.6927 22.5262 28.9428 22.2761C29.1928 22.0261 29.3333 21.687 29.3333 21.3333V16C29.3292 15.7975 29.2791 15.5986 29.1867 15.4184C29.0943 15.2382 28.962 15.0815 28.8 14.96ZM26.6666 16.64V20H22.6666V13.44L26.6666 16.64ZM9.33331 24C9.33331 24.2637 9.25511 24.5215 9.1086 24.7408C8.96209 24.96 8.75385 25.1309 8.51022 25.2318C8.26658 25.3328 7.99849 25.3592 7.73985 25.3077C7.48121 25.2563 7.24363 25.1293 7.05716 24.9428C6.87069 24.7563 6.74371 24.5188 6.69226 24.2601C6.64081 24.0015 6.66722 23.7334 6.76813 23.4898C6.86905 23.2461 7.03995 23.0379 7.25921 22.8914C7.47848 22.7449 7.73626 22.6667 7.99997 22.6667C8.35359 22.6667 8.69273 22.8071 8.94278 23.0572C9.19283 23.3072 9.33331 23.6464 9.33331 24ZM16 20H5.33331V6.66667H20V20H16ZM25.3333 24C25.3333 24.2637 25.2551 24.5215 25.1086 24.7408C24.9621 24.96 24.7539 25.1309 24.5102 25.2318C24.2666 25.3328 23.9985 25.3592 23.7399 25.3077C23.4812 25.2563 23.2436 25.1293 23.0572 24.9428C22.8707 24.7563 22.7437 24.5188 22.6923 24.2601C22.6408 24.0015 22.6672 23.7334 22.7681 23.4898C22.869 23.2461 23.0399 23.0379 23.2592 22.8914C23.4785 22.7449 23.7363 22.6667 24 22.6667C24.3536 22.6667 24.6927 22.8071 24.9428 23.0572C25.1928 23.3072 25.3333 23.6464 25.3333 24Z" fill="#5677FC"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d_222_18500" x="-1.33643" y="4" width="34.6697" height="32.0314" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="4"/>
|
||||
<feGaussianBlur stdDeviation="2"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_222_18500"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_222_18500" result="shape"/>
|
||||
</filter>
|
||||
<clipPath id="clip0_222_18500">
|
||||
<rect width="32" height="32" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
|
|
@ -0,0 +1,6 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12 4H6.66667C5.95942 4 5.28115 4.28095 4.78105 4.78105C4.28095 5.28115 4 5.95942 4 6.66667V12C4 12.7072 4.28095 13.3855 4.78105 13.8856C5.28115 14.3857 5.95942 14.6667 6.66667 14.6667H12C12.7072 14.6667 13.3855 14.3857 13.8856 13.8856C14.3857 13.3855 14.6667 12.7072 14.6667 12V6.66667C14.6667 5.95942 14.3857 5.28115 13.8856 4.78105C13.3855 4.28095 12.7072 4 12 4ZM6.66667 12V6.66667H12V12H6.66667Z" fill="#5677FC"/>
|
||||
<path d="M25.3333 4H19.9999C19.2927 4 18.6144 4.28095 18.1143 4.78105C17.6142 5.28115 17.3333 5.95942 17.3333 6.66667V12C17.3333 12.7072 17.6142 13.3855 18.1143 13.8856C18.6144 14.3857 19.2927 14.6667 19.9999 14.6667H25.3333C26.0405 14.6667 26.7188 14.3857 27.2189 13.8856C27.719 13.3855 27.9999 12.7072 27.9999 12V6.66667C27.9999 5.95942 27.719 5.28115 27.2189 4.78105C26.7188 4.28095 26.0405 4 25.3333 4ZM19.9999 12V6.66667H25.3333V12H19.9999Z" fill="#5677FC"/>
|
||||
<path d="M12 17.3334H6.66667C5.95942 17.3334 5.28115 17.6143 4.78105 18.1144C4.28095 18.6145 4 19.2928 4 20V25.3334C4 26.0406 4.28095 26.7189 4.78105 27.219C5.28115 27.7191 5.95942 28 6.66667 28H12C12.7072 28 13.3855 27.7191 13.8856 27.219C14.3857 26.7189 14.6667 26.0406 14.6667 25.3334V20C14.6667 19.2928 14.3857 18.6145 13.8856 18.1144C13.3855 17.6143 12.7072 17.3334 12 17.3334ZM6.66667 25.3334V20H12V25.3334H6.66667Z" fill="#5677FC"/>
|
||||
<path d="M25.3333 17.3334H19.9999C19.2927 17.3334 18.6144 17.6143 18.1143 18.1144C17.6142 18.6145 17.3333 19.2928 17.3333 20V25.3334C17.3333 26.0406 17.6142 26.7189 18.1143 27.219C18.6144 27.7191 19.2927 28 19.9999 28H25.3333C26.0405 28 26.7188 27.7191 27.2189 27.219C27.719 26.7189 27.9999 26.0406 27.9999 25.3334V20C27.9999 19.2928 27.719 18.6145 27.2189 18.1144C26.7188 17.6143 26.0405 17.3334 25.3333 17.3334ZM19.9999 25.3334V20H25.3333V25.3334H19.9999Z" fill="#5677FC"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
|
|
@ -0,0 +1,10 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_222_18466)">
|
||||
<path d="M27.2266 13.5733L16.9466 3.06664C16.8226 2.94167 16.6752 2.84248 16.5127 2.77478C16.3502 2.70709 16.1759 2.67224 15.9999 2.67224C15.8239 2.67224 15.6496 2.70709 15.4871 2.77478C15.3247 2.84248 15.1772 2.94167 15.0532 3.06664L4.77324 13.5866C4.52449 13.8374 4.32804 14.1351 4.19528 14.4624C4.06252 14.7897 3.99612 15.1401 3.99991 15.4933V26.6666C3.99888 27.3492 4.25961 28.0062 4.72841 28.5022C5.19721 28.9983 5.83839 29.2958 6.51991 29.3333H25.4799C26.1614 29.2958 26.8026 28.9983 27.2714 28.5022C27.7402 28.0062 28.0009 27.3492 27.9999 26.6666V15.4933C28.001 14.7772 27.7237 14.0888 27.2266 13.5733ZM13.3332 26.6666V18.6666H18.6666V26.6666H13.3332ZM25.3332 26.6666H21.3332V17.3333C21.3332 16.9797 21.1928 16.6405 20.9427 16.3905C20.6927 16.1404 20.3535 16 19.9999 16H11.9999C11.6463 16 11.3071 16.1404 11.0571 16.3905C10.8071 16.6405 10.6666 16.9797 10.6666 17.3333V26.6666H6.66658V15.44L15.9999 5.90664L25.3332 15.4933V26.6666Z" fill="#5677FC"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_222_18466">
|
||||
<rect width="32" height="32" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.0001 2.66663C13.363 2.66663 10.7851 3.44861 8.59248 4.9137C6.39983 6.37878 4.69086 8.46116 3.68169 10.8975C2.67253 13.3339 2.40848 16.0147 2.92295 18.6012C3.43742 21.1876 4.7073 23.5633 6.572 25.428C8.4367 27.2927 10.8125 28.5626 13.3989 29.0771C15.9853 29.5916 18.6662 29.3275 21.1025 28.3184C23.5389 27.3092 25.6213 25.6002 27.0863 23.4076C28.5514 21.2149 29.3334 18.637 29.3334 16C29.3334 14.249 28.9885 12.5152 28.3185 10.8975C27.6484 9.27984 26.6663 7.80998 25.4282 6.57187C24.1901 5.33375 22.7202 4.35163 21.1025 3.68157C19.4849 3.0115 17.751 2.66663 16.0001 2.66663ZM16.0001 26.6666C13.8904 26.6666 11.8281 26.041 10.074 24.869C8.31988 23.6969 6.95271 22.031 6.14537 20.0819C5.33804 18.1328 5.1268 15.9881 5.53838 13.919C5.94995 11.8499 6.96586 9.94925 8.45761 8.45749C9.94938 6.96573 11.85 5.94983 13.9191 5.53825C15.9883 5.12667 18.133 5.33791 20.082 6.14524C22.0311 6.95258 23.697 8.31975 24.8691 10.0739C26.0412 11.828 26.6668 13.8903 26.6668 16C26.6668 18.8289 25.5429 21.542 23.5426 23.5424C21.5422 25.5428 18.8291 26.6666 16.0001 26.6666Z" fill="#5677FC"/>
|
||||
<path d="M16.0001 22.6667C16.7365 22.6667 17.3334 22.0697 17.3334 21.3333C17.3334 20.597 16.7365 20 16.0001 20C15.2637 20 14.6667 20.597 14.6667 21.3333C14.6667 22.0697 15.2637 22.6667 16.0001 22.6667Z" fill="#5677FC"/>
|
||||
<path d="M16.0001 9.33337C15.6465 9.33337 15.3073 9.47385 15.0573 9.7239C14.8072 9.97395 14.6667 10.3131 14.6667 10.6667V17.3334C14.6667 17.687 14.8072 18.0261 15.0573 18.2762C15.3073 18.5262 15.6465 18.6667 16.0001 18.6667C16.3537 18.6667 16.6928 18.5262 16.9429 18.2762C17.1929 18.0261 17.3334 17.687 17.3334 17.3334V10.6667C17.3334 10.3131 17.1929 9.97395 16.9429 9.7239C16.6928 9.47385 16.3537 9.33337 16.0001 9.33337Z" fill="#5677FC"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
|
|
@ -0,0 +1,3 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M25.3334 5.33337H6.66675C5.60588 5.33337 4.58847 5.7548 3.83832 6.50495C3.08818 7.25509 2.66675 8.27251 2.66675 9.33337V22.6667C2.66675 23.7276 3.08818 24.745 3.83832 25.4951C4.58847 26.2453 5.60588 26.6667 6.66675 26.6667H25.3334C26.3943 26.6667 27.4117 26.2453 28.1618 25.4951C28.912 24.745 29.3334 23.7276 29.3334 22.6667V9.33337C29.3334 8.27251 28.912 7.25509 28.1618 6.50495C27.4117 5.7548 26.3943 5.33337 25.3334 5.33337ZM24.4401 8.00004L16.0001 14.3334L7.56008 8.00004H24.4401ZM25.3334 24H6.66675C6.31313 24 5.97399 23.8596 5.72394 23.6095C5.47389 23.3595 5.33341 23.0203 5.33341 22.6667V9.66671L15.2001 17.0667C15.4309 17.2398 15.7116 17.3334 16.0001 17.3334C16.2886 17.3334 16.5693 17.2398 16.8001 17.0667L26.6667 9.66671V22.6667C26.6667 23.0203 26.5263 23.3595 26.2762 23.6095C26.0262 23.8596 25.687 24 25.3334 24Z" fill="#5677FC"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 955 B |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17.1599 29.3334C16.5161 29.3326 15.8983 29.0788 15.4399 28.6267L6.89324 20.0667C6.67392 19.8486 6.53723 19.5611 6.50657 19.2534L5.33324 6.7867C5.31528 6.59141 5.34062 6.39456 5.40746 6.21018C5.47429 6.02581 5.58098 5.85845 5.71991 5.72003C5.85832 5.5811 6.02569 5.47441 6.21006 5.40758C6.39443 5.34074 6.59128 5.3154 6.78657 5.33336L19.2532 6.5067C19.561 6.53736 19.8485 6.67405 20.0666 6.89336L28.6266 15.44C29.0801 15.8949 29.3348 16.511 29.3348 17.1534C29.3348 17.7957 29.0801 18.4118 28.6266 18.8667L18.8666 28.6267C18.4131 29.078 17.7997 29.332 17.1599 29.3334ZM9.15991 18.52L17.1599 26.52L26.5599 17.12L18.5599 9.12003L8.14657 8.1467L9.15991 18.52Z" fill="#5677FC"/>
|
||||
<path d="M14 16C15.1046 16 16 15.1046 16 14C16 12.8954 15.1046 12 14 12C12.8954 12 12 12.8954 12 14C12 15.1046 12.8954 16 14 16Z" fill="#5677FC"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 933 B |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M26.8267 8.94667L23.0533 5.17333C22.3039 4.42297 21.2872 4.00093 20.2267 4H11.7733C10.7128 4.00093 9.69609 4.42297 8.94667 5.17333L5.17333 8.94667C4.42297 9.69609 4.00093 10.7128 4 11.7733V24C4 25.0609 4.42143 26.0783 5.17157 26.8284C5.92172 27.5786 6.93913 28 8 28H24C25.0609 28 26.0783 27.5786 26.8284 26.8284C27.5786 26.0783 28 25.0609 28 24V11.7733C27.9991 10.7128 27.577 9.69609 26.8267 8.94667ZM10.8267 7.05333C11.0822 6.80969 11.4203 6.67158 11.7733 6.66667H20.2267C20.5797 6.67158 20.9178 6.80969 21.1733 7.05333L23.4533 9.33333H8.54667L10.8267 7.05333ZM24 25.3333H8C7.64638 25.3333 7.30724 25.1929 7.05719 24.9428C6.80714 24.6928 6.66667 24.3536 6.66667 24V12H25.3333V24C25.3333 24.3536 25.1929 24.6928 24.9428 24.9428C24.6928 25.1929 24.3536 25.3333 24 25.3333Z" fill="#5677FC"/>
|
||||
<path d="M20.0001 14.6666C19.6465 14.6666 19.3073 14.8071 19.0573 15.0572C18.8072 15.3072 18.6667 15.6463 18.6667 16C18.6667 16.7072 18.3858 17.3855 17.8857 17.8856C17.3856 18.3857 16.7073 18.6666 16.0001 18.6666C15.2928 18.6666 14.6146 18.3857 14.1145 17.8856C13.6144 17.3855 13.3334 16.7072 13.3334 16C13.3334 15.6463 13.1929 15.3072 12.9429 15.0572C12.6928 14.8071 12.3537 14.6666 12.0001 14.6666C11.6465 14.6666 11.3073 14.8071 11.0573 15.0572C10.8072 15.3072 10.6667 15.6463 10.6667 16C10.6667 17.4144 11.2287 18.771 12.2288 19.7712C13.229 20.7714 14.5856 21.3333 16.0001 21.3333C17.4146 21.3333 18.7711 20.7714 19.7713 19.7712C20.7715 18.771 21.3334 17.4144 21.3334 16C21.3334 15.6463 21.1929 15.3072 20.9429 15.0572C20.6928 14.8071 20.3537 14.6666 20.0001 14.6666Z" fill="#5677FC"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1,3 @@
|
|||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.4342 9.58606C6.01999 9.58606 5.6842 9.92185 5.6842 10.3361C5.6842 10.7503 6.01999 11.0861 6.4342 11.0861V9.58606ZM22.0921 11.0861C22.5063 11.0861 22.8421 10.7503 22.8421 10.3361C22.8421 9.92185 22.5063 9.58606 22.0921 9.58606V11.0861ZM6.4342 14.0597C6.01999 14.0597 5.6842 14.3955 5.6842 14.8097C5.6842 15.224 6.01999 15.5597 6.4342 15.5597V14.0597ZM19.8553 15.5597C20.2695 15.5597 20.6053 15.224 20.6053 14.8097C20.6053 14.3955 20.2695 14.0597 19.8553 14.0597V15.5597ZM6.4342 18.5334C6.01999 18.5334 5.6842 18.8692 5.6842 19.2834C5.6842 19.6976 6.01999 20.0334 6.4342 20.0334V18.5334ZM14.2632 20.0334C14.6774 20.0334 15.0132 19.6976 15.0132 19.2834C15.0132 18.8692 14.6774 18.5334 14.2632 18.5334V20.0334ZM6.4342 11.0861H22.0921V9.58606H6.4342V11.0861ZM6.4342 15.5597H19.8553V14.0597H6.4342V15.5597ZM6.4342 20.0334H14.2632V18.5334H6.4342V20.0334Z" fill="#4B4B4B"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 981 B |
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="23" height="21" viewBox="0 0 23 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.2354 16L20.2942 19.3333" stroke="#4B4B4B" stroke-width="1.824"/>
|
||||
<path d="M19.788 10C19.788 14.9898 15.5923 19.088 10.35 19.088C5.10771 19.088 0.912 14.9898 0.912 10C0.912 5.01015 5.10771 0.912 10.35 0.912C15.5923 0.912 19.788 5.01015 19.788 10Z" stroke="#4B4B4B" stroke-width="1.824"/>
|
||||
<path d="M21.275 18.3333L13.8 12.2222L10.35 11.1111L23 12.2222L21.275 18.3333Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 498 B |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
|
@ -0,0 +1,34 @@
|
|||
**/dgph
|
||||
*.mode1v3
|
||||
*.mode2v3
|
||||
*.moved-aside
|
||||
*.pbxuser
|
||||
*.perspectivev3
|
||||
**/*sync/
|
||||
.sconsign.dblite
|
||||
.tags*
|
||||
**/.vagrant/
|
||||
**/DerivedData/
|
||||
Icon?
|
||||
**/Pods/
|
||||
**/.symlinks/
|
||||
profile
|
||||
xcuserdata
|
||||
**/.generated/
|
||||
Flutter/App.framework
|
||||
Flutter/Flutter.framework
|
||||
Flutter/Flutter.podspec
|
||||
Flutter/Generated.xcconfig
|
||||
Flutter/ephemeral/
|
||||
Flutter/app.flx
|
||||
Flutter/app.zip
|
||||
Flutter/flutter_assets/
|
||||
Flutter/flutter_export_environment.sh
|
||||
ServiceDefinitions.json
|
||||
Runner/GeneratedPluginRegistrant.*
|
||||
|
||||
# Exceptions to above rules.
|
||||
!default.mode1v3
|
||||
!default.mode2v3
|
||||
!default.pbxuser
|
||||
!default.perspectivev3
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>App</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>io.flutter.flutter.app</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>App</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>11.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1 @@
|
|||
#include "Generated.xcconfig"
|
||||
|
|
@ -0,0 +1 @@
|
|||
#include "Generated.xcconfig"
|
||||
|
|
@ -0,0 +1,483 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 54;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
97C146EB1CF9000F007C117D /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */,
|
||||
);
|
||||
name = Flutter;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146E51CF9000F007C117D = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9740EEB11CF90186004384FC /* Flutter */,
|
||||
97C146F01CF9000F007C117D /* Runner */,
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146EF1CF9000F007C117D /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
97C146EE1CF9000F007C117D /* Runner.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146F01CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
|
||||
97C147021CF9000F007C117D /* Info.plist */,
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
|
||||
);
|
||||
path = Runner;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
97C146ED1CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
9740EEB61CF901F6004384FC /* Run Script */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = Runner;
|
||||
productName = Runner;
|
||||
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
97C146E61CF9000F007C117D /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 1300;
|
||||
ORGANIZATIONNAME = "";
|
||||
TargetAttributes = {
|
||||
97C146ED1CF9000F007C117D = {
|
||||
CreatedOnToolsVersion = 7.3.1;
|
||||
LastSwiftMigration = 1100;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
|
||||
compatibilityVersion = "Xcode 9.3";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 97C146E51CF9000F007C117D;
|
||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
97C146ED1CF9000F007C117D /* Runner */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
97C146EC1CF9000F007C117D /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Thin Binary";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Run Script";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
97C146EA1CF9000F007C117D /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C146FB1CF9000F007C117D /* Base */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C147001CF9000F007C117D /* Base */,
|
||||
);
|
||||
name = LaunchScreen.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
249021D3217E4FDB00AE95B9 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
249021D4217E4FDB00AE95B9 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.sapalyShop;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
97C147031CF9000F007C117D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
97C147041CF9000F007C117D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
97C147061CF9000F007C117D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.sapalyShop;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
97C147071CF9000F007C117D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.sapalyShop;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
97C147031CF9000F007C117D /* Debug */,
|
||||
97C147041CF9000F007C117D /* Release */,
|
||||
249021D3217E4FDB00AE95B9 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
97C147061CF9000F007C117D /* Debug */,
|
||||
97C147071CF9000F007C117D /* Release */,
|
||||
249021D4217E4FDB00AE95B9 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Profile"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "group:Runner.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
import UIKit
|
||||
import Flutter
|
||||
|
||||
@UIApplicationMain
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||
) -> Bool {
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-20x20@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-40x40@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-60x60@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-60x60@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-20x20@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-40x40@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-76x76@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-76x76@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-83.5x83.5@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "Icon-App-1024x1024@1x.png",
|
||||
"scale" : "1x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 295 B |
|
After Width: | Height: | Size: 406 B |
|
After Width: | Height: | Size: 450 B |
|
After Width: | Height: | Size: 282 B |
|
After Width: | Height: | Size: 462 B |
|
After Width: | Height: | Size: 704 B |
|
After Width: | Height: | Size: 406 B |
|
After Width: | Height: | Size: 586 B |
|
After Width: | Height: | Size: 862 B |
|
After Width: | Height: | Size: 862 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 762 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "LaunchImage.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "LaunchImage@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "LaunchImage@3x.png",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 68 B |
|
After Width: | Height: | Size: 68 B |
|
After Width: | Height: | Size: 68 B |
|
|
@ -0,0 +1,5 @@
|
|||
# Launch Screen Assets
|
||||
|
||||
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
|
||||
|
||||
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
|
||||
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="53" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="LaunchImage" width="168" height="185"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Flutter View Controller-->
|
||||
<scene sceneID="tne-QT-ifu">
|
||||
<objects>
|
||||
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Sapaly Shop</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>sapaly_shop</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -0,0 +1 @@
|
|||
#import "GeneratedPluginRegistrant.h"
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
arb-dir: lib/l10n
|
||||
template-arb-file: app_en.arb
|
||||
output-localization-file: app_localizations.dart
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sapaly_shop/services/app_constants.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
Widget customButton({
|
||||
void Function()? tap,
|
||||
bool? status = false,
|
||||
String? text = 'Save',
|
||||
String? statusText,
|
||||
bool? isValid = false,
|
||||
BuildContext? context,
|
||||
}) {
|
||||
return Container(
|
||||
height: 48.adaptedPx(),
|
||||
width: AppConstants.deviceWidth(context!),
|
||||
margin: EdgeInsets.symmetric(
|
||||
vertical: 15.adaptedPx(), horizontal: 10.adaptedPx()),
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(8.adaptedPx()),
|
||||
color: status == false
|
||||
? AppTheme.lightPrimaryColor
|
||||
: AppTheme.blackColor.withOpacity(0.3),
|
||||
),
|
||||
child: TextButton(
|
||||
onPressed: status == true ? null : tap,
|
||||
child: Text(
|
||||
status == false ? text! : statusText!,
|
||||
style: Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
fontSize: 18.adaptedPx(),
|
||||
color: AppTheme.whiteColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sapaly_shop/services/app_constants.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
class ProductCard extends StatelessWidget {
|
||||
final String imageUrl, price, discountPrice, description;
|
||||
final int discountPriceValue;
|
||||
final VoidCallback onPressed;
|
||||
|
||||
const ProductCard({
|
||||
Key? key,
|
||||
required this.imageUrl,
|
||||
required this.price,
|
||||
required this.discountPrice,
|
||||
required this.description,
|
||||
required this.onPressed,
|
||||
required this.discountPriceValue,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(15.adaptedPx()),
|
||||
),
|
||||
child: TextButton(
|
||||
onPressed: onPressed,
|
||||
style: TextButton.styleFrom(
|
||||
padding: EdgeInsets.zero,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(15.adaptedPx()),
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(15.adaptedPx()),
|
||||
topRight: Radius.circular(15.adaptedPx()),
|
||||
),
|
||||
child: Image.network(
|
||||
imageUrl,
|
||||
fit: BoxFit.fitWidth,
|
||||
alignment: Alignment.center,
|
||||
height: AppConstants.deviceHeight(context) / 7,
|
||||
width: double.infinity,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 4.adaptedPx(),
|
||||
vertical: 5.adaptedPx(),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
price,
|
||||
maxLines: 2,
|
||||
softWrap: true,
|
||||
style:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: AppTheme.blackColor,
|
||||
fontSize: 13.adaptedPx(),
|
||||
),
|
||||
),
|
||||
SizedBox(width: 5.adaptedPx()),
|
||||
discountPriceValue == 0
|
||||
? Container()
|
||||
: Text(
|
||||
discountPrice,
|
||||
maxLines: 2,
|
||||
softWrap: true,
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontWeight: FontWeight.w400,
|
||||
color: AppTheme.redColor,
|
||||
decoration: TextDecoration.lineThrough,
|
||||
fontSize: 10.adaptedPx(),
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
SizedBox(
|
||||
width: 30.adaptedPx(),
|
||||
height: 30.adaptedPx(),
|
||||
child: RawMaterialButton(
|
||||
shape: const CircleBorder(),
|
||||
fillColor: AppTheme.lightPrimaryColor,
|
||||
onPressed: () {},
|
||||
child: const Icon(
|
||||
Icons.add,
|
||||
color: AppTheme.whiteColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10.adaptedPx()),
|
||||
child: Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
description,
|
||||
softWrap: true,
|
||||
style:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
fontWeight: FontWeight.w400,
|
||||
color: AppTheme.blackColor,
|
||||
fontSize: 11.adaptedPx(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sapaly_shop/components/sapaly_icon.dart';
|
||||
|
||||
import '../themes/app_theme.dart';
|
||||
|
||||
class SapalyAppBar extends StatelessWidget with PreferredSizeWidget {
|
||||
const SapalyAppBar({
|
||||
Key? key,
|
||||
required this.hasActionButton,
|
||||
required this.title,
|
||||
required this.actionButton,
|
||||
required this.leadingButton,
|
||||
required this.leadingOnTap,
|
||||
required this.actionOnTap,
|
||||
required this.badge,
|
||||
}) : super(key: key);
|
||||
|
||||
final bool hasActionButton;
|
||||
final String title, badge;
|
||||
final Widget leadingButton;
|
||||
final void Function() leadingOnTap;
|
||||
final void Function() actionOnTap;
|
||||
final Widget actionButton;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.all(10.adaptedPx()),
|
||||
child: AppBar(
|
||||
backgroundColor: AppTheme.lightBackgroundColor,
|
||||
toolbarHeight: 65.adaptedPx(),
|
||||
centerTitle: true,
|
||||
elevation: 0,
|
||||
titleTextStyle: Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
color: AppTheme.blackColor,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 20.adaptedPx(),
|
||||
),
|
||||
toolbarTextStyle:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
color: AppTheme.blackColor,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 20.adaptedPx(),
|
||||
),
|
||||
leading: SapalyIcon(
|
||||
height: 50.adaptedPx(),
|
||||
width: 50.adaptedPx(),
|
||||
onTap: leadingOnTap,
|
||||
hasBadge: false,
|
||||
child: leadingButton,
|
||||
),
|
||||
title: Text(
|
||||
title,
|
||||
),
|
||||
actions: [
|
||||
hasActionButton
|
||||
? SapalyIcon(
|
||||
onTap: actionOnTap,
|
||||
height: 50.adaptedPx(),
|
||||
width: 50.adaptedPx(),
|
||||
hasBadge: true,
|
||||
badge: badge,
|
||||
child: actionButton,
|
||||
)
|
||||
: Container(),
|
||||
],
|
||||
// ],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Size get preferredSize => Size(0, 75.adaptedPx());
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../themes/app_theme.dart';
|
||||
|
||||
class SapalyIcon extends StatelessWidget {
|
||||
const SapalyIcon({
|
||||
super.key,
|
||||
required this.child,
|
||||
required this.onTap,
|
||||
required this.width,
|
||||
required this.height,
|
||||
required this.hasBadge,
|
||||
this.badge,
|
||||
});
|
||||
final Widget child;
|
||||
final bool hasBadge;
|
||||
final String? badge;
|
||||
final VoidCallback onTap;
|
||||
final double width, height;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Builder(
|
||||
builder: (context) {
|
||||
return hasBadge
|
||||
? Badge(
|
||||
textStyle:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
color: AppTheme.whiteColor,
|
||||
),
|
||||
largeSize: 16.adaptedPx(),
|
||||
alignment: AlignmentDirectional(30.adaptedPx(), 0),
|
||||
label: Text(
|
||||
badge!,
|
||||
),
|
||||
child: SizedBox(
|
||||
width: width,
|
||||
height: height,
|
||||
child: RawMaterialButton(
|
||||
elevation: 0,
|
||||
focusElevation: 0,
|
||||
hoverElevation: 0,
|
||||
highlightElevation: 0,
|
||||
highlightColor: AppTheme.lightPrimaryColor.withOpacity(0.3),
|
||||
splashColor: AppTheme.lightPrimaryColor.withOpacity(0.4),
|
||||
shape: const CircleBorder(),
|
||||
fillColor: AppTheme.whiteColor,
|
||||
onPressed: onTap,
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
)
|
||||
: SizedBox(
|
||||
width: width,
|
||||
height: height,
|
||||
child: RawMaterialButton(
|
||||
elevation: 0,
|
||||
focusElevation: 0,
|
||||
hoverElevation: 0,
|
||||
highlightElevation: 0,
|
||||
focusColor: AppTheme.lightPrimaryColor,
|
||||
highlightColor: AppTheme.lightPrimaryColor.withOpacity(0.3),
|
||||
splashColor: AppTheme.lightPrimaryColor.withOpacity(0.4),
|
||||
shape: const CircleBorder(),
|
||||
fillColor: AppTheme.whiteColor,
|
||||
onPressed: onTap,
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
// Container(
|
||||
// width: width,
|
||||
// height: height,
|
||||
// decoration: BoxDecoration(
|
||||
// color: AppTheme.whiteColor,
|
||||
// borderRadius: BorderRadius.circular(50.adaptedPx()),
|
||||
// ),
|
||||
// child: TextButton(
|
||||
// onPressed: onTap,
|
||||
// child: child,
|
||||
// style: ButtonStyle(
|
||||
// shape: MaterialStateProperty.all<RoundedRectangleBorder>(
|
||||
// RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.circular(50),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
// void successMessage({String? message, BuildContext? context}) {
|
||||
// ScaffoldMessenger.of(context!).showSnackBar(
|
||||
// SnackBar(
|
||||
// content: Text(
|
||||
// message!,
|
||||
// style: Theme.of(context).primaryTextTheme.bodyMedium,
|
||||
// ),
|
||||
// backgroundColor: AppTheme.blackColor,
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
|
||||
// void errorMessage({String? message, BuildContext? context}) {
|
||||
// ScaffoldMessenger.of(context!).showSnackBar(
|
||||
// SnackBar(
|
||||
// content: Text(
|
||||
// message!,
|
||||
// style: Theme.of(context).primaryTextTheme.bodyMedium,
|
||||
// ),
|
||||
// backgroundColor: AppTheme.redColor,
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
|
||||
void showMessage({String? message, BuildContext? context}) {
|
||||
ScaffoldMessenger.of(context!).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
message!,
|
||||
style: Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
fontSize: 16.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
Widget customTextField({
|
||||
String? title,
|
||||
String? hint,
|
||||
TextEditingController? controller,
|
||||
int? maxLines = 1,
|
||||
BuildContext? context,
|
||||
}) {
|
||||
return Column(
|
||||
children: [
|
||||
Container(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
title!,
|
||||
style: Theme.of(context!).primaryTextTheme.bodyMedium?.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
TextFormField(
|
||||
controller: controller,
|
||||
maxLines: maxLines,
|
||||
cursorColor: AppTheme.lightPrimaryColor,
|
||||
decoration: InputDecoration(
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(15.adaptedPx()),
|
||||
borderSide: const BorderSide(
|
||||
color: AppTheme.lightPrimaryColor,
|
||||
),
|
||||
),
|
||||
focusColor: AppTheme.lightPrimaryColor,
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"categories":"Categories",
|
||||
"searchHint":"Search"
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"categories":"Категории",
|
||||
"searchHint":"Поиск"
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"categories":"Kategoriýalar",
|
||||
"searchHint":"Gözleg"
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sapaly_shop/onboard.dart';
|
||||
import 'package:sapaly_shop/providers/auth_provider/auth_provider.dart';
|
||||
import 'package:sapaly_shop/screens/auth/login.dart';
|
||||
import 'package:sapaly_shop/screens/category/category_screen.dart';
|
||||
import 'package:sapaly_shop/screens/dashboard/dashboard.dart';
|
||||
import 'package:sapaly_shop/screens/drawer/sapaly_drawer.dart';
|
||||
import 'package:sapaly_shop/screens/home/home_screen.dart';
|
||||
import 'package:sapaly_shop/services/app_constants.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'models/settings_model.dart';
|
||||
|
||||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
await SettingsModel.initLocalization(
|
||||
prefs.getString('language') ?? kDefaultLanguage);
|
||||
runApp(
|
||||
MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider(create: (_) => SettingsModel(prefs)),
|
||||
ChangeNotifierProvider(create: (_) => AuthenticatonProvider()),
|
||||
],
|
||||
child: const MyApp(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
const MyApp({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizeInitializer(
|
||||
builder: (context) {
|
||||
return MaterialApp(
|
||||
debugShowCheckedModeBanner: false,
|
||||
theme: AppTheme.appLightTheme,
|
||||
title: 'Sapaly Mahabat',
|
||||
initialRoute: '/login',
|
||||
routes: <String, WidgetBuilder>{
|
||||
'/': (context) => const Dashboard(),
|
||||
'/drawer': (context) => SapalyDrawer(),
|
||||
'/onboard': (context) => const Onboard(),
|
||||
'/home': (context) => const HomeScreen(),
|
||||
'/login': (context) => const LoginScreen(),
|
||||
'/category': (context) => const CategoryScreen(),
|
||||
},
|
||||
localizationsDelegates: AppConstants.localizationsDelegate,
|
||||
supportedLocales: AppConstants.supportedLocales,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
import 'dart:convert';
|
||||
|
||||
class CategoryModel {
|
||||
CategoryModel({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.translations,
|
||||
required this.icon,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final String name;
|
||||
final List<Translation> translations;
|
||||
final Iconca icon;
|
||||
|
||||
factory CategoryModel.fromJson(
|
||||
Map<String, dynamic> json, String currentLang) {
|
||||
final List<Translation> translations = (json['translations'] as List)
|
||||
.map((e) => Translation.fromJson(e))
|
||||
.toList();
|
||||
|
||||
String language = json['name'] ?? '';
|
||||
for (Translation item in translations) {
|
||||
if (item.locale == currentLang) language = item.attributeData['name'];
|
||||
}
|
||||
|
||||
return CategoryModel(
|
||||
id: json["id"] ?? '',
|
||||
name: language,
|
||||
translations: (json['translations'] as List)
|
||||
.map((e) => Translation.fromJson(e))
|
||||
.toList(),
|
||||
icon: Iconca.fromJson(json["icon"] ?? ''),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Iconca {
|
||||
Iconca({
|
||||
required this.id,
|
||||
required this.path,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final String path;
|
||||
|
||||
factory Iconca.fromJson(Map<String, dynamic> json) => Iconca(
|
||||
id: json["id"] ?? 0,
|
||||
path: json["path"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"path": path,
|
||||
};
|
||||
}
|
||||
|
||||
class Translation {
|
||||
Translation({
|
||||
required this.locale,
|
||||
required this.modelId,
|
||||
required this.attributeData,
|
||||
});
|
||||
|
||||
final String locale;
|
||||
final String modelId;
|
||||
final Map attributeData;
|
||||
|
||||
factory Translation.fromJson(Map<String, dynamic> jsn) => Translation(
|
||||
locale: jsn["locale"],
|
||||
modelId: jsn["model_id"],
|
||||
attributeData: json.decode(jsn["attribute_data"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"locale": locale,
|
||||
"model_id": modelId,
|
||||
"attribute_data": attributeData,
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
import 'dart:convert';
|
||||
|
||||
class DetailsModel {
|
||||
DetailsModel({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.categoryId,
|
||||
required this.description,
|
||||
// required this.translations,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final String name;
|
||||
final int categoryId;
|
||||
final String description;
|
||||
// final List<Translation> translations;
|
||||
|
||||
factory DetailsModel.fromJson(Map<String, dynamic> json) {
|
||||
// final List<Translation> translations = (json['translations'] as List)
|
||||
// .map((e) => Translation.fromJson(e))
|
||||
// .toList();
|
||||
// String language = json['name'] ?? '';
|
||||
|
||||
// for (Translation item in translations) {
|
||||
// if (item.locale == currentLang) language = item.attributeData['name'];
|
||||
// }
|
||||
return DetailsModel(
|
||||
id: json["id"] ?? 0,
|
||||
name: json['name'] ?? '',
|
||||
description: json["description"] ?? '',
|
||||
categoryId: json["category_id"] ?? 0,
|
||||
// translations: List<Translation>.from(
|
||||
// json["translations"].map((x) => Translation.fromJson(x))),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Translation {
|
||||
Translation({
|
||||
required this.locale,
|
||||
required this.modelId,
|
||||
required this.attributeData,
|
||||
});
|
||||
|
||||
final String locale;
|
||||
final String modelId;
|
||||
final Map attributeData;
|
||||
|
||||
factory Translation.fromJson(Map<String, dynamic> jsn) => Translation(
|
||||
locale: jsn["locale"] ?? '',
|
||||
modelId: jsn["model_id"] ?? '',
|
||||
attributeData: json.decode(jsn["attribute_data"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"locale": locale,
|
||||
"model_id": modelId,
|
||||
"attribute_data": attributeData,
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,143 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final productModel = productModelFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
class ProductModel {
|
||||
ProductModel({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.slug,
|
||||
required this.categoryId,
|
||||
required this.previewImage,
|
||||
required this.translations,
|
||||
required this.offer,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final String name;
|
||||
final String slug;
|
||||
final int categoryId;
|
||||
final PreviewImage previewImage;
|
||||
final List<Translation> translations;
|
||||
final List<Offer> offer;
|
||||
|
||||
factory ProductModel.fromJson(Map<String, dynamic> json, String currentLang) {
|
||||
final List<Translation> translations = (json['translations'] as List)
|
||||
.map((e) => Translation.fromJson(e))
|
||||
.toList();
|
||||
String language = json['name'] ?? '';
|
||||
|
||||
for (Translation item in translations) {
|
||||
if (item.locale == currentLang) language = item.attributeData['name'];
|
||||
}
|
||||
|
||||
return ProductModel(
|
||||
id: json["id"] ?? '',
|
||||
name: language,
|
||||
slug: json["slug"] ?? '',
|
||||
categoryId: json["category_id"] ?? '',
|
||||
previewImage: PreviewImage.fromJson(json["preview_image"] ?? ''),
|
||||
translations: List<Translation>.from(
|
||||
json["translations"].map((x) => Translation.fromJson(x))),
|
||||
offer: List<Offer>.from(json["offer"].map((x) => Offer.fromJson(x))),
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"slug": slug,
|
||||
"category_id": categoryId,
|
||||
"preview_image": previewImage.toJson(),
|
||||
"translations": List<dynamic>.from(translations.map((x) => x.toJson())),
|
||||
};
|
||||
}
|
||||
|
||||
class PreviewImage {
|
||||
PreviewImage({
|
||||
required this.id,
|
||||
required this.sortOrder,
|
||||
required this.path,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final int sortOrder;
|
||||
final String path;
|
||||
|
||||
factory PreviewImage.fromJson(Map<String, dynamic> json) => PreviewImage(
|
||||
id: json["id"] ?? '',
|
||||
sortOrder: json["sort_order"] ?? '',
|
||||
path: json["path"] ?? '',
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"sort_order": sortOrder,
|
||||
"path": path,
|
||||
};
|
||||
}
|
||||
|
||||
class Translation {
|
||||
Translation({
|
||||
required this.locale,
|
||||
required this.modelId,
|
||||
required this.attributeData,
|
||||
});
|
||||
|
||||
final String locale;
|
||||
final String modelId;
|
||||
final Map attributeData;
|
||||
|
||||
factory Translation.fromJson(Map<String, dynamic> jsn) => Translation(
|
||||
locale: jsn["locale"] ?? '',
|
||||
modelId: jsn["model_id"] ?? '',
|
||||
attributeData: json.decode(jsn["attribute_data"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"locale": locale,
|
||||
"model_id": modelId,
|
||||
"attribute_data": attributeData,
|
||||
};
|
||||
}
|
||||
|
||||
class Offer {
|
||||
Offer({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.quantity,
|
||||
required this.description,
|
||||
required this.price,
|
||||
required this.oldPrice,
|
||||
required this.discountPriceValue,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final String name;
|
||||
final int quantity;
|
||||
final String description;
|
||||
final String price;
|
||||
final String oldPrice;
|
||||
final int discountPriceValue;
|
||||
|
||||
factory Offer.fromJson(Map<String, dynamic> json) => Offer(
|
||||
id: json["id"] ?? '',
|
||||
name: json["name"] ?? '',
|
||||
quantity: json["quantity"] ?? '',
|
||||
discountPriceValue: json['discount_price_value'] ?? '',
|
||||
description: json["description"] ?? '',
|
||||
price: json["price"] ?? '',
|
||||
oldPrice: json["old_price"] ?? '',
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"quantity": quantity,
|
||||
"description": description,
|
||||
"price": price,
|
||||
"old_price": oldPrice,
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
const kDefaultLanguage = 'tk';
|
||||
|
||||
class SettingsModel extends ChangeNotifier {
|
||||
String _language = kDefaultLanguage;
|
||||
|
||||
static AppLocalizations? _localization;
|
||||
static Future<void> initLocalization(String l) async {
|
||||
_localization =
|
||||
await AppLocalizations.delegate.load(Locale(l, l == 'en' ? 'US' : ''));
|
||||
await AppLocalizations.delegate.load(Locale(l));
|
||||
}
|
||||
|
||||
Future<void> setLanguage(String l) async {
|
||||
_language = l;
|
||||
await initLocalization(l);
|
||||
var prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString('language', _language);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
String get currentLanguage => _language;
|
||||
|
||||
Locale get language {
|
||||
switch (_language) {
|
||||
case 'ru':
|
||||
return const Locale('ru', '');
|
||||
case 'en':
|
||||
return const Locale('en', 'US');
|
||||
case 'tk':
|
||||
return const Locale('tk', '');
|
||||
default:
|
||||
return const Locale('tk', '');
|
||||
}
|
||||
}
|
||||
|
||||
void launch(SharedPreferences prefs) {
|
||||
_language = prefs.getString('language') ?? _language;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
SettingsModel(SharedPreferences prefs) {
|
||||
launch(prefs);
|
||||
}
|
||||
|
||||
static SettingsModel of(BuildContext context, [bool listen = false]) {
|
||||
return Provider.of<SettingsModel>(context, listen: listen);
|
||||
}
|
||||
}
|
||||
|
||||
extension LocalMessageExt on String {
|
||||
String get translation {
|
||||
return <String, String?>{
|
||||
"categories": SettingsModel._localization?.categories,
|
||||
"searchHint": SettingsModel._localization?.searchHint,
|
||||
}[this] ??
|
||||
this;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
class SlidersModel {
|
||||
SlidersModel({
|
||||
required this.id,
|
||||
required this.img,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final String img;
|
||||
|
||||
factory SlidersModel.fromJson(Map<String, dynamic> json) =>
|
||||
SlidersModel(id: json["id"] ?? '', img: json["img"] ?? '');
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:sapaly_shop/screens/auth/login.dart';
|
||||
|
||||
class Onboard extends StatefulWidget {
|
||||
const Onboard({super.key});
|
||||
|
||||
@override
|
||||
State<Onboard> createState() => _OnboardState();
|
||||
}
|
||||
|
||||
class _OnboardState extends State<Onboard> {
|
||||
void navigate(BuildContext context) {
|
||||
Future.delayed(const Duration(seconds: 3), () {
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const LoginScreen(),
|
||||
),
|
||||
(route) => false);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
navigate(context);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Scaffold(
|
||||
body: Center(
|
||||
child: Text('On Board'),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:sapaly_shop/services/app_constants.dart';
|
||||
|
||||
class AuthenticatonProvider extends ChangeNotifier {
|
||||
// Base URL
|
||||
final requestBaseUrl = kBaseUrl;
|
||||
bool _isLoading = false;
|
||||
String _resMessage = '';
|
||||
|
||||
// Getter
|
||||
bool get isLoading => _isLoading;
|
||||
String get resMeessage => _resMessage;
|
||||
|
||||
// for sign_up
|
||||
void register({
|
||||
required String email,
|
||||
required String phoneNumber,
|
||||
required String password,
|
||||
required String repeatPassword,
|
||||
BuildContext? context,
|
||||
}) async {
|
||||
_isLoading = true;
|
||||
notifyListeners();
|
||||
|
||||
String url = '$requestBaseUrl/api/jwt/register';
|
||||
|
||||
final body = {
|
||||
'email': email,
|
||||
'phone': phoneNumber,
|
||||
'password': password,
|
||||
'password_confirmation': repeatPassword,
|
||||
};
|
||||
|
||||
debugPrint('This is SIGNUP BODY ${body.toString()}');
|
||||
|
||||
try {
|
||||
final req = await http.post(Uri.parse(url), body: json.encode(body));
|
||||
|
||||
if (req.statusCode == 200 || req.statusCode == 201) {
|
||||
debugPrint('SIGNUP success ${req.body}');
|
||||
} else {
|
||||
final res = json.decode(req.body);
|
||||
debugPrint('SIGNUP error ${res.body}');
|
||||
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
}
|
||||
} on SocketException catch (error) {
|
||||
_isLoading = false;
|
||||
_resMessage = 'Internet connection is not available';
|
||||
notifyListeners();
|
||||
} catch (err) {
|
||||
_isLoading = false;
|
||||
_resMessage = 'Please try again';
|
||||
notifyListeners();
|
||||
|
||||
debugPrint('::::: ${err.toString()}');
|
||||
}
|
||||
}
|
||||
|
||||
// for sign_in
|
||||
void login({
|
||||
required String email,
|
||||
required String password,
|
||||
BuildContext? context,
|
||||
}) async {
|
||||
_isLoading = true;
|
||||
notifyListeners();
|
||||
|
||||
String url = '$requestBaseUrl/api/jwt/login';
|
||||
|
||||
final body = {
|
||||
'email': email,
|
||||
'password': password,
|
||||
};
|
||||
|
||||
debugPrint('This is SIGNUP BODY ${body.toString()}');
|
||||
|
||||
try {
|
||||
final req = await http.post(Uri.parse(url), body: json.encode(body));
|
||||
|
||||
if (req.statusCode == 200 || req.statusCode == 201) {
|
||||
debugPrint('LOGIN success ${req.body}');
|
||||
} else {
|
||||
final res = json.decode(req.body);
|
||||
debugPrint('LOGIN error ${res.body}');
|
||||
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
}
|
||||
} on SocketException catch (error) {
|
||||
_isLoading = false;
|
||||
_resMessage = 'Internet connection is not available';
|
||||
notifyListeners();
|
||||
} catch (err) {
|
||||
_isLoading = false;
|
||||
_resMessage = 'Please try again';
|
||||
notifyListeners();
|
||||
|
||||
debugPrint('::::: ${err.toString()}');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sapaly_shop/components/custom_button.dart';
|
||||
import 'package:sapaly_shop/components/snack_message.dart';
|
||||
import 'package:sapaly_shop/components/text_field.dart';
|
||||
import 'package:sapaly_shop/providers/auth_provider/auth_provider.dart';
|
||||
import 'package:sapaly_shop/screens/auth/register.dart';
|
||||
import 'package:sapaly_shop/services/app_constants.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
import '../../services/page_navigator.dart';
|
||||
|
||||
class LoginScreen extends StatefulWidget {
|
||||
const LoginScreen({super.key});
|
||||
|
||||
@override
|
||||
State<LoginScreen> createState() => _LoginScreenState();
|
||||
}
|
||||
|
||||
class _LoginScreenState extends State<LoginScreen> {
|
||||
final TextEditingController _email = TextEditingController();
|
||||
final TextEditingController _password = TextEditingController();
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_email.clear();
|
||||
_password.clear();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Center(
|
||||
child: Container(
|
||||
margin: EdgeInsets.symmetric(
|
||||
horizontal: AppConstants.horizontalPadding(context),
|
||||
),
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: AppConstants.horizontalPadding(context),
|
||||
),
|
||||
height: AppConstants.deviceHeight(context) / (1.4),
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
width: 2.adaptedPx(),
|
||||
color: AppTheme.blackColor.withOpacity(0.1),
|
||||
),
|
||||
borderRadius: BorderRadius.circular(15.adaptedPx()),
|
||||
),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image.asset('assets/images/sapalyLogo.png'),
|
||||
SizedBox(width: 20.adaptedPx()),
|
||||
Text(
|
||||
AppConstants.kAppName,
|
||||
style:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
color: AppTheme.blackColor,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 20.adaptedPx(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 20.adaptedPx()),
|
||||
customTextField(
|
||||
title: 'Email',
|
||||
context: context,
|
||||
hint: 'Enter your valid email address',
|
||||
controller: _email,
|
||||
),
|
||||
SizedBox(height: 20.adaptedPx()),
|
||||
customTextField(
|
||||
title: 'Password',
|
||||
context: context,
|
||||
hint: 'Enter your secured password',
|
||||
controller: _password,
|
||||
),
|
||||
SizedBox(height: 45.adaptedPx()),
|
||||
Consumer<AuthenticatonProvider>(builder: (context, auth, child) {
|
||||
return customButton(
|
||||
text: 'Login',
|
||||
tap: () {
|
||||
if (_email.text.isEmpty || _password.text.isEmpty) {
|
||||
showMessage(
|
||||
context: context,
|
||||
message: 'All fields are required',
|
||||
);
|
||||
} else {
|
||||
auth.login(
|
||||
email: _email.text.trim(),
|
||||
password: _password.text.trim());
|
||||
}
|
||||
},
|
||||
context: context,
|
||||
statusText: 'Loggin in...',
|
||||
status: auth.isLoading,
|
||||
);
|
||||
}),
|
||||
Text(
|
||||
'Or',
|
||||
textAlign: TextAlign.center,
|
||||
style: Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
color: AppTheme.blackColor,
|
||||
fontSize: 18.adaptedPx(),
|
||||
),
|
||||
),
|
||||
customButton(
|
||||
text: 'Register',
|
||||
tap: () {
|
||||
PageNavigator(ctx: context).nextPage(
|
||||
page: const RegisterScreen(),
|
||||
);
|
||||
},
|
||||
context: context,
|
||||
isValid: false,
|
||||
status: false,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sapaly_shop/components/custom_button.dart';
|
||||
import 'package:sapaly_shop/components/text_field.dart';
|
||||
import 'package:sapaly_shop/screens/auth/login.dart';
|
||||
import 'package:sapaly_shop/services/app_constants.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
import '../../services/page_navigator.dart';
|
||||
|
||||
class RegisterScreen extends StatefulWidget {
|
||||
const RegisterScreen({super.key});
|
||||
|
||||
@override
|
||||
State<RegisterScreen> createState() => _RegisterScreenState();
|
||||
}
|
||||
|
||||
class _RegisterScreenState extends State<RegisterScreen> {
|
||||
final TextEditingController _email = TextEditingController();
|
||||
final TextEditingController _password = TextEditingController();
|
||||
final TextEditingController _passwordConfirm = TextEditingController();
|
||||
final TextEditingController _phone = TextEditingController();
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_email.clear();
|
||||
_password.clear();
|
||||
_passwordConfirm.clear();
|
||||
_phone.clear();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Center(
|
||||
child: Container(
|
||||
margin: EdgeInsets.symmetric(
|
||||
horizontal: AppConstants.horizontalPadding(context),
|
||||
),
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: AppConstants.horizontalPadding(context),
|
||||
),
|
||||
height: AppConstants.deviceHeight(context) / (1.13),
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
width: 2.adaptedPx(),
|
||||
color: AppTheme.blackColor.withOpacity(0.1),
|
||||
),
|
||||
borderRadius: BorderRadius.circular(15.adaptedPx()),
|
||||
),
|
||||
child: ListView(
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image.asset('assets/images/sapalyLogo.png'),
|
||||
SizedBox(width: 20.adaptedPx()),
|
||||
Text(
|
||||
AppConstants.kAppName,
|
||||
style:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
color: AppTheme.blackColor,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 20.adaptedPx(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 20.adaptedPx()),
|
||||
customTextField(
|
||||
title: 'Your email',
|
||||
context: context,
|
||||
controller: _email,
|
||||
hint: '',
|
||||
),
|
||||
SizedBox(height: 15.adaptedPx()),
|
||||
customTextField(title: 'Phone number', context: context),
|
||||
SizedBox(height: 15.adaptedPx()),
|
||||
customTextField(title: 'Password', context: context),
|
||||
SizedBox(height: 15.adaptedPx()),
|
||||
customTextField(title: 'Password confirmation', context: context),
|
||||
SizedBox(height: 15.adaptedPx()),
|
||||
customButton(
|
||||
text: 'Register',
|
||||
context: context,
|
||||
status: false,
|
||||
statusText: 'Registering...',
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 15.adaptedPx()),
|
||||
child: Text(
|
||||
'Or',
|
||||
textAlign: TextAlign.center,
|
||||
style:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
|
||||
color: AppTheme.blackColor,
|
||||
fontSize: 18.adaptedPx(),
|
||||
),
|
||||
),
|
||||
),
|
||||
customButton(
|
||||
text: 'Login',
|
||||
context: context,
|
||||
tap: () {
|
||||
PageNavigator(ctx: context).nextPageOnly(
|
||||
page: const LoginScreen(),
|
||||
);
|
||||
},
|
||||
statusText: 'Loggin in...',
|
||||
status: true,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sapaly_shop/components/sapaly_app_bar.dart';
|
||||
import 'package:sapaly_shop/models/category_model.dart';
|
||||
import 'package:sapaly_shop/models/settings_model.dart';
|
||||
import 'package:sapaly_shop/services/requests.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
class CategoryScreen extends StatefulWidget {
|
||||
const CategoryScreen({super.key});
|
||||
|
||||
@override
|
||||
State<CategoryScreen> createState() => _CategoryScreenState();
|
||||
}
|
||||
|
||||
class _CategoryScreenState extends State<CategoryScreen> {
|
||||
bool hasError = false;
|
||||
bool isLoading = true;
|
||||
List<CategoryModel> categories = [];
|
||||
late String currentLang;
|
||||
|
||||
Future<void> getCategories() async {
|
||||
try {
|
||||
var list = await API().getCategories();
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
categories = list;
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint(e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
getCategories();
|
||||
currentLang = SettingsModel.of(context).currentLanguage;
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppTheme.lightBackgroundColor,
|
||||
appBar: SapalyAppBar(
|
||||
hasActionButton: true,
|
||||
title: 'categories'.translation,
|
||||
badge: '2',
|
||||
leadingButton: const Icon(
|
||||
Icons.arrow_back,
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
actionButton: SvgPicture.asset('assets/icons/cart.svg'),
|
||||
leadingOnTap: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
actionOnTap: () {},
|
||||
),
|
||||
body: categories.isEmpty
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: GridView.builder(
|
||||
padding: EdgeInsets.symmetric(horizontal: 5.adaptedPx()),
|
||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 2,
|
||||
crossAxisSpacing: 10.adaptedPx(),
|
||||
childAspectRatio: 5 / 4,
|
||||
mainAxisSpacing: 10.adaptedPx(),
|
||||
),
|
||||
itemCount: categories.length,
|
||||
itemBuilder: (context, index) {
|
||||
return SizedBox(
|
||||
width: 15.adaptedPx(),
|
||||
height: 15.adaptedPx(),
|
||||
child: RawMaterialButton(
|
||||
onPressed: () {},
|
||||
splashColor: AppTheme.lightPrimaryColor.withOpacity(0.1),
|
||||
highlightColor: AppTheme.lightPrimaryColor.withOpacity(0.1),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(25.adaptedPx())),
|
||||
child: Container(
|
||||
width: MediaQuery.of(context).size.width,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: AppTheme.lightPrimaryColor,
|
||||
width: 2.adaptedPx()),
|
||||
borderRadius: BorderRadius.circular(25.adaptedPx()),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 3,
|
||||
child: CachedNetworkImage(
|
||||
imageUrl: categories[index].icon.path,
|
||||
width: MediaQuery.of(context).size.width / 7,
|
||||
fit: BoxFit.contain,
|
||||
progressIndicatorBuilder:
|
||||
(context, url, progress) => const Center(
|
||||
child: CircularProgressIndicator()),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: Text(
|
||||
categories[index].name,
|
||||
maxLines: 3,
|
||||
softWrap: true,
|
||||
textAlign: TextAlign.center,
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontSize: 15.adaptedPx(),
|
||||
fontWeight: FontWeight.w600,
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
)),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
import '../../services/app_constants.dart';
|
||||
|
||||
class Dashboard extends StatelessWidget {
|
||||
const Dashboard({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
color: AppTheme.lightBackgroundColor,
|
||||
child: Container(
|
||||
alignment: Alignment.center,
|
||||
height: AppConstants.deviceHeight(context) / 2,
|
||||
margin: EdgeInsets.symmetric(horizontal: 15.adaptedPx()),
|
||||
decoration: BoxDecoration(
|
||||
color: AppTheme.whiteColor,
|
||||
borderRadius: BorderRadius.circular(16.adaptedPx())),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/images/sapalyLogo.png',
|
||||
width: 60.adaptedPx(),
|
||||
height: 60.adaptedPx(),
|
||||
),
|
||||
SizedBox(width: 10.adaptedPx()),
|
||||
Text(
|
||||
AppConstants.kAppName,
|
||||
style: GoogleFonts.poppins(
|
||||
textStyle:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium!.copyWith(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 18.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Text(
|
||||
'Dil saylan',
|
||||
style: GoogleFonts.poppins(
|
||||
textStyle:
|
||||
Theme.of(context).primaryTextTheme.bodyMedium!.copyWith(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 18.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,254 @@
|
|||
import 'package:adaptix/adaptix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:sapaly_shop/components/sapaly_app_bar.dart';
|
||||
import 'package:sapaly_shop/models/details_model.dart';
|
||||
import 'package:sapaly_shop/models/settings_model.dart';
|
||||
import 'package:sapaly_shop/services/requests.dart';
|
||||
import 'package:sapaly_shop/themes/app_theme.dart';
|
||||
|
||||
class Details extends StatefulWidget {
|
||||
const Details({
|
||||
super.key,
|
||||
required this.id,
|
||||
required this.image,
|
||||
required this.description,
|
||||
required this.price,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final String image, description, price;
|
||||
|
||||
@override
|
||||
State<Details> createState() => _DetailsState();
|
||||
}
|
||||
|
||||
class _DetailsState extends State<Details> {
|
||||
int amount = 1;
|
||||
DetailsModel? details;
|
||||
|
||||
Future<void> getData() async {
|
||||
final result = await API().getDetails(widget.id);
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
details = result;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
late String currentLanguage;
|
||||
@override
|
||||
void initState() {
|
||||
getData();
|
||||
currentLanguage = SettingsModel.of(context).currentLanguage;
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppTheme.lightBackgroundColor,
|
||||
appBar: SapalyAppBar(
|
||||
hasActionButton: true,
|
||||
badge: '2',
|
||||
title: 'Details',
|
||||
actionButton: SvgPicture.asset('assets/icons/cart.svg'),
|
||||
leadingButton: const Icon(Icons.arrow_back, color: AppTheme.blackColor),
|
||||
leadingOnTap: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
actionOnTap: () {},
|
||||
),
|
||||
body: details == null
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: Container(
|
||||
alignment: Alignment.center,
|
||||
margin: EdgeInsets.symmetric(
|
||||
horizontal: 20.adaptedPx(),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 15.adaptedPx()),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(16.adaptedPx()),
|
||||
child: Image.network(
|
||||
widget.image,
|
||||
width: double.infinity,
|
||||
),
|
||||
),
|
||||
),
|
||||
Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
widget.description,
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 18.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 15.adaptedPx()),
|
||||
child: Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
widget.description,
|
||||
textAlign: TextAlign.left,
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 13.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
widget.price,
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 18.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
color: AppTheme.whiteColor,
|
||||
borderRadius: BorderRadius.circular(16.adaptedPx()),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
amount++;
|
||||
});
|
||||
},
|
||||
style: TextButton.styleFrom(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(16.adaptedPx()),
|
||||
bottomLeft: Radius.circular(16.adaptedPx()),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'+',
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontSize: 18.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 10.adaptedPx()),
|
||||
child: Text(
|
||||
amount.toString(),
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontSize: 18.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
amount--;
|
||||
});
|
||||
},
|
||||
style: TextButton.styleFrom(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(
|
||||
topRight: Radius.circular(16.adaptedPx()),
|
||||
bottomRight:
|
||||
Radius.circular(16.adaptedPx()),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'-',
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontSize: 18.adaptedPx(),
|
||||
color: AppTheme.blackColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const Spacer(),
|
||||
MaterialButton(
|
||||
onPressed: () {
|
||||
var snackBar = SnackBar(
|
||||
content: Text(
|
||||
'Added to Card',
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
fontSize: 15.adaptedPx(),
|
||||
),
|
||||
),
|
||||
);
|
||||
ScaffoldMessenger.of(context).showSnackBar(snackBar);
|
||||
},
|
||||
height: 50.adaptedPx(),
|
||||
color: AppTheme.lightPrimaryColor,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(16.adaptedPx())),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const Icon(
|
||||
Icons.shopping_cart,
|
||||
color: AppTheme.whiteColor,
|
||||
),
|
||||
SizedBox(width: 10.adaptedPx()),
|
||||
Text(
|
||||
'Add to Cart',
|
||||
style: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.bodyMedium
|
||||
?.copyWith(
|
||||
color: AppTheme.whiteColor,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20.adaptedPx()),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||