initial commit

This commit is contained in:
code 2023-02-25 20:18:33 +05:00
parent 8665bb3370
commit aa01c7f01a
111 changed files with 4849 additions and 0 deletions

44
.gitignore vendored Normal file
View File

@ -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

45
.metadata Normal file
View File

@ -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'

29
analysis_options.yaml Normal file
View File

@ -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

13
android/.gitignore vendored Normal file
View File

@ -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

71
android/app/build.gradle Normal file
View File

@ -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"
}

View File

@ -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>

View File

@ -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>

View File

@ -0,0 +1,6 @@
package com.example.sapaly_shop
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}

View File

@ -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>

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -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>

View File

@ -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>

View File

@ -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>

31
android/build.gradle Normal file
View File

@ -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
}

View File

@ -0,0 +1,3 @@
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true

View File

@ -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

11
android/settings.gradle Normal file
View File

@ -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"

5
assets/icons/cart.svg Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

3
assets/icons/menu.svg Normal file
View File

@ -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

5
assets/icons/search.svg Normal file
View File

@ -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

BIN
assets/images/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
assets/images/2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
assets/images/3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
assets/images/banner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

34
ios/.gitignore vendored Normal file
View File

@ -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

View File

@ -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>

View File

@ -0,0 +1 @@
#include "Generated.xcconfig"

View File

@ -0,0 +1 @@
#include "Generated.xcconfig"

View File

@ -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 */;
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>

View File

@ -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>

View File

@ -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>

View File

@ -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)
}
}

View File

@ -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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

View File

@ -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.

View File

@ -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>

View File

@ -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>

51
ios/Runner/Info.plist Normal file
View File

@ -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>

View File

@ -0,0 +1 @@
#import "GeneratedPluginRegistrant.h"

3
l10.yaml Normal file
View File

@ -0,0 +1,3 @@
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart

View File

@ -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
lib/components/dot.dart Normal file
View File

View File

@ -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(),
),
),
),
),
),
],
),
),
);
}
}

View File

@ -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());
}

View File

@ -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),
// ),
// ),
// ),
// ),
// );
},
);
}
}

View File

View File

@ -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,
),
),
),
);
}

View File

@ -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),
),
),
),
],
);
}

4
lib/l10n/app_en.arb Normal file
View File

@ -0,0 +1,4 @@
{
"categories":"Categories",
"searchHint":"Search"
}

4
lib/l10n/app_ru.arb Normal file
View File

@ -0,0 +1,4 @@
{
"categories":"Категории",
"searchHint":"Поиск"
}

4
lib/l10n/app_tk.arb Normal file
View File

@ -0,0 +1,4 @@
{
"categories":"Kategoriýalar",
"searchHint":"Gözleg"
}

59
lib/main.dart Normal file
View File

@ -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,
);
},
);
}
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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;
}
}

View File

@ -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"] ?? '');
}

36
lib/onboard.dart Normal file
View File

@ -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'),
),
);
}
}

View File

@ -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()}');
}
}
}

131
lib/screens/auth/login.dart Normal file
View File

@ -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,
),
],
),
),
),
);
}
}

View File

@ -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,
),
],
),
),
),
);
}
}

View File

@ -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,
),
),
),
],
)),
),
);
},
),
);
}
}

View File

@ -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,
),
),
),
],
),
),
);
}
}

View File

@ -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()),
],
),
),
);
}
}

Some files were not shown because too many files have changed in this diff Show More