shopify_app 14.4.4 → 18.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +1 -0
- data/.github/ISSUE_TEMPLATE/bug-report.md +63 -0
- data/.github/ISSUE_TEMPLATE/config.yml +1 -0
- data/.github/ISSUE_TEMPLATE/feature-request.md +33 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +17 -1
- data/.github/workflows/build.yml +41 -0
- data/.github/workflows/release.yml +24 -0
- data/.github/workflows/rubocop.yml +1 -7
- data/.gitignore +0 -2
- data/CHANGELOG.md +75 -0
- data/CONTRIBUTING.md +76 -0
- data/Gemfile.lock +268 -0
- data/README.md +73 -572
- data/app/assets/images/storage_access.svg +1 -2
- data/app/assets/javascripts/shopify_app/post_redirect.js +9 -0
- data/app/controllers/concerns/shopify_app/ensure_authenticated_links.rb +26 -0
- data/app/controllers/concerns/shopify_app/shop_access_scopes_verification.rb +32 -0
- data/app/controllers/shopify_app/callback_controller.rb +34 -10
- data/app/controllers/shopify_app/sessions_controller.rb +19 -20
- data/app/views/shopify_app/partials/_button_styles.html.erb +41 -36
- data/app/views/shopify_app/partials/_card_styles.html.erb +3 -3
- data/app/views/shopify_app/partials/_empty_state_styles.html.erb +28 -59
- data/app/views/shopify_app/partials/_form_styles.html.erb +56 -0
- data/app/views/shopify_app/partials/_layout_styles.html.erb +16 -1
- data/app/views/shopify_app/partials/_typography_styles.html.erb +6 -6
- data/app/views/shopify_app/sessions/enable_cookies.html.erb +1 -1
- data/app/views/shopify_app/sessions/new.html.erb +38 -110
- data/app/views/shopify_app/sessions/request_storage_access.html.erb +1 -1
- data/app/views/shopify_app/sessions/top_level_interaction.html.erb +20 -15
- data/app/views/shopify_app/shared/post_redirect_to_auth_shopify.html.erb +13 -0
- data/config/locales/de.yml +11 -11
- data/config/locales/nl.yml +1 -1
- data/config/locales/vi.yml +22 -0
- data/config/locales/zh-CN.yml +1 -1
- data/docs/Quickstart.md +15 -77
- data/docs/Releasing.md +9 -6
- data/docs/Troubleshooting.md +147 -4
- data/docs/Upgrading.md +126 -0
- data/docs/shopify_app/authentication.md +124 -0
- data/docs/shopify_app/engine.md +82 -0
- data/docs/shopify_app/generators.md +127 -0
- data/docs/shopify_app/handling-access-scopes-changes.md +14 -0
- data/docs/shopify_app/script-tags.md +28 -0
- data/docs/shopify_app/session-repository.md +88 -0
- data/docs/shopify_app/testing.md +38 -0
- data/docs/shopify_app/webhooks.md +72 -0
- data/lib/generators/shopify_app/home_controller/home_controller_generator.rb +16 -7
- data/lib/generators/shopify_app/home_controller/templates/home_controller.rb +10 -0
- data/lib/generators/shopify_app/home_controller/templates/index.html.erb +11 -11
- data/lib/generators/shopify_app/home_controller/templates/unauthenticated_home_controller.rb +2 -0
- data/lib/generators/shopify_app/install/install_generator.rb +36 -2
- data/lib/generators/shopify_app/install/templates/embedded_app.html.erb +2 -1
- data/lib/generators/shopify_app/install/templates/omniauth.rb +1 -0
- data/lib/generators/shopify_app/install/templates/shopify_app.js +1 -1
- data/lib/generators/shopify_app/install/templates/shopify_app.rb.tt +13 -4
- data/lib/generators/shopify_app/install/templates/shopify_provider.rb.tt +8 -0
- data/lib/generators/shopify_app/shop_model/shop_model_generator.rb +27 -0
- data/lib/generators/shopify_app/shop_model/templates/db/migrate/add_shop_access_scopes_column.erb +5 -0
- data/lib/generators/shopify_app/shop_model/templates/shop.rb +1 -1
- data/lib/generators/shopify_app/shopify_app_generator.rb +1 -1
- data/lib/generators/shopify_app/user_model/templates/db/migrate/add_user_access_scopes_column.erb +5 -0
- data/lib/generators/shopify_app/user_model/templates/user.rb +1 -1
- data/lib/generators/shopify_app/user_model/user_model_generator.rb +27 -0
- data/lib/shopify_app/access_scopes/noop_strategy.rb +13 -0
- data/lib/shopify_app/access_scopes/shop_strategy.rb +24 -0
- data/lib/shopify_app/access_scopes/user_strategy.rb +41 -0
- data/lib/shopify_app/configuration.rb +25 -0
- data/lib/shopify_app/controller_concerns/itp.rb +0 -2
- data/lib/shopify_app/controller_concerns/login_protection.rb +14 -17
- data/lib/shopify_app/engine.rb +1 -0
- data/lib/shopify_app/middleware/same_site_cookie_middleware.rb +1 -1
- data/lib/shopify_app/omniauth/omniauth_configuration.rb +64 -0
- data/lib/shopify_app/session/in_memory_shop_session_store.rb +9 -7
- data/lib/shopify_app/session/in_memory_user_session_store.rb +9 -7
- data/lib/shopify_app/session/jwt.rb +3 -1
- data/lib/shopify_app/session/shop_session_storage_with_scopes.rb +58 -0
- data/lib/shopify_app/session/user_session_storage_with_scopes.rb +58 -0
- data/lib/shopify_app/utils.rb +12 -0
- data/lib/shopify_app/version.rb +1 -1
- data/lib/shopify_app.rb +11 -0
- data/package.json +1 -1
- data/service.yml +1 -4
- data/shopify_app.gemspec +5 -4
- data/translation.yml +1 -1
- data/yarn.lock +92 -123
- metadata +62 -16
- data/.github/ISSUE_TEMPLATE.md +0 -19
- data/.travis.yml +0 -27
- data/docs/install-on-dev-shop.png +0 -0
- data/docs/test-your-app.png +0 -0
- data/lib/generators/shopify_app/install/templates/shopify_provider.rb +0 -20
@@ -35,7 +35,7 @@
|
|
35
35
|
min-height:100%;
|
36
36
|
margin:0;
|
37
37
|
padding:0;
|
38
|
-
background-color:#
|
38
|
+
background-color:#f6f6f7;
|
39
39
|
}
|
40
40
|
|
41
41
|
*,
|
@@ -61,6 +61,10 @@
|
|
61
61
|
max-width:99.8rem;
|
62
62
|
}
|
63
63
|
|
64
|
+
.Polaris-Page--InstallApp {
|
65
|
+
max-width: 70rem;
|
66
|
+
}
|
67
|
+
|
64
68
|
@media (min-width: 30.625em) {
|
65
69
|
.Polaris-Page {
|
66
70
|
padding:0 2rem;
|
@@ -73,6 +77,7 @@
|
|
73
77
|
}
|
74
78
|
|
75
79
|
.Polaris-Page__Content {
|
80
|
+
width: 100%;
|
76
81
|
margin:2rem 0;
|
77
82
|
}
|
78
83
|
|
@@ -158,6 +163,16 @@
|
|
158
163
|
justify-content:flex-end;
|
159
164
|
}
|
160
165
|
|
166
|
+
.Polaris-Stack--distributionTrailingCustomSpacing {
|
167
|
+
margin-right:2rem;
|
168
|
+
}
|
169
|
+
|
170
|
+
@media (min-width: 30.625em) {
|
171
|
+
.Polaris-Stack--distributionTrailingCustomSpacing {
|
172
|
+
margin-right:0;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
161
176
|
.Polaris-Stack--vertical {
|
162
177
|
-webkit-box-orient:vertical;
|
163
178
|
-webkit-box-direction:normal;
|
@@ -16,16 +16,16 @@
|
|
16
16
|
margin:0;
|
17
17
|
}
|
18
18
|
|
19
|
-
.Polaris-DisplayText--
|
20
|
-
font-size:
|
19
|
+
.Polaris-DisplayText--sizeSmall {
|
20
|
+
font-size:1.6rem;
|
21
21
|
font-weight:400;
|
22
|
-
line-height:2.
|
22
|
+
line-height:2.4rem;
|
23
23
|
}
|
24
24
|
|
25
25
|
@media (min-width: 40em) {
|
26
|
-
.Polaris-DisplayText--
|
27
|
-
font-size:
|
28
|
-
line-height:
|
26
|
+
.Polaris-DisplayText--sizeSmall {
|
27
|
+
font-size:2rem;
|
28
|
+
line-height:2.8rem;
|
29
29
|
}
|
30
30
|
}
|
31
31
|
|
@@ -52,7 +52,7 @@
|
|
52
52
|
</div>
|
53
53
|
</div>
|
54
54
|
<div class="Polaris-Stack__Item">
|
55
|
-
<div class="Polaris-Stack Polaris-Stack--distributionTrailing">
|
55
|
+
<div class="Polaris-Stack Polaris-Stack--distributionTrailing Polaris-Stack--distributionTrailingCustomSpacing">
|
56
56
|
<div class="Polaris-Stack__Item">
|
57
57
|
<button type="button" class="Polaris-Button Polaris-Button--primary" id="AcceptCookies">
|
58
58
|
<span class="Polaris-Button__Content"><span><%= I18n.t('enable_cookies_action') %></span></span>
|
@@ -5,119 +5,47 @@
|
|
5
5
|
|
6
6
|
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
box-sizing: border-box;
|
14
|
-
}
|
15
|
-
|
16
|
-
body {
|
17
|
-
padding: 2.5em 0;
|
18
|
-
color: #212b37;
|
19
|
-
font-family: -apple-system,BlinkMacSystemFont,San Francisco,Roboto,Segoe UI,Helvetica Neue,sans-serif;
|
20
|
-
}
|
21
|
-
|
22
|
-
.container {
|
23
|
-
width: 100%;
|
24
|
-
text-align: center;
|
25
|
-
margin-left: auto;
|
26
|
-
margin-right: auto;
|
27
|
-
}
|
28
|
-
|
29
|
-
@media screen and (min-width: 510px) {
|
30
|
-
.container {
|
31
|
-
width: 510px;
|
32
|
-
}
|
33
|
-
}
|
34
|
-
|
35
|
-
.title {
|
36
|
-
font-size: 1.5em;
|
37
|
-
margin: 2em auto;
|
38
|
-
display: flex;
|
39
|
-
align-items: center;
|
40
|
-
justify-content: center;
|
41
|
-
word-break: break-all;
|
42
|
-
}
|
43
|
-
|
44
|
-
.subtitle {
|
45
|
-
font-size: 0.8em;
|
46
|
-
font-weight: 500;
|
47
|
-
color: #64737f;
|
48
|
-
line-height: 2em;
|
49
|
-
}
|
50
|
-
|
51
|
-
.error {
|
52
|
-
line-height: 1em;
|
53
|
-
padding: 0.5em;
|
54
|
-
color: red;
|
55
|
-
}
|
56
|
-
|
57
|
-
input.marketing-input {
|
58
|
-
width: 100%;
|
59
|
-
height: 52px;
|
60
|
-
padding: 0 15px;
|
61
|
-
box-shadow: 0 0 0 1px #ddd;
|
62
|
-
border: 0;
|
63
|
-
border-radius: 5px;
|
64
|
-
background-color: #fff;
|
65
|
-
font-size: 1em;
|
66
|
-
margin-bottom: 15px;
|
67
|
-
}
|
68
|
-
|
69
|
-
input.marketing-input:focus {
|
70
|
-
color: #000;
|
71
|
-
outline: 0;
|
72
|
-
box-shadow: 0 0 0 2px #5e6ebf;
|
73
|
-
}
|
74
|
-
|
75
|
-
button.marketing-button {
|
76
|
-
display: inline-block;
|
77
|
-
width: 100%;
|
78
|
-
padding: 1.0625em 1.875em;
|
79
|
-
background-color: #5e6ebf;
|
80
|
-
color: #fff;
|
81
|
-
font-weight: 700;
|
82
|
-
font-size: 1em;
|
83
|
-
text-align: center;
|
84
|
-
outline: none;
|
85
|
-
border: 0 solid transparent;
|
86
|
-
border-radius: 5px;
|
87
|
-
cursor: pointer;
|
88
|
-
}
|
89
|
-
|
90
|
-
button.marketing-button:hover {
|
91
|
-
background: linear-gradient(to bottom, #5c6ac4, #4959bd);
|
92
|
-
border-color: #3f4eae;
|
93
|
-
}
|
94
|
-
|
95
|
-
button.marketing-button:focus {
|
96
|
-
box-shadow: 0 0 0.1875em 0.1875em rgba(94,110,191,0.5);
|
97
|
-
background-color: #223274;
|
98
|
-
color: #fff;
|
99
|
-
}
|
100
|
-
</style>
|
8
|
+
<%= render 'shopify_app/partials/layout_styles' %>
|
9
|
+
<%= render 'shopify_app/partials/typography_styles' %>
|
10
|
+
<%= render 'shopify_app/partials/card_styles' %>
|
11
|
+
<%= render 'shopify_app/partials/button_styles' %>
|
12
|
+
<%= render 'shopify_app/partials/form_styles' %>
|
101
13
|
</head>
|
102
14
|
<body>
|
103
|
-
|
104
15
|
<main class="container" role="main">
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
16
|
+
<div class="Polaris-Page Polaris-Page--InstallApp">
|
17
|
+
<div class="Polaris-Page__Content">
|
18
|
+
<div class="Polaris-Layout">
|
19
|
+
<div class="Polaris-Layout__Section">
|
20
|
+
<div class="Polaris-Card">
|
21
|
+
<div class="Polaris-Card__Header">
|
22
|
+
<% application_name = ShopifyApp.configuration.application_name %>
|
23
|
+
<h1 class="Polaris-Heading">
|
24
|
+
<%= application_name.presence || 'Shopify App – Installation' %>
|
25
|
+
</h1>
|
26
|
+
</div>
|
27
|
+
<div class="Polaris-Card__Section">
|
28
|
+
<%= form_tag login_path do %>
|
29
|
+
<div class="Polaris-Label">
|
30
|
+
<label class="Polaris-Label__Text" for="shop">Enter your shop domain to log in or install this app.</label>
|
31
|
+
</div>
|
32
|
+
<div class="Polaris-TextField <%= 'Polaris-TextField--InlineError' if flash[:error]%>">
|
33
|
+
<input id="shop" name="shop" type="text" autofocus="autofocus" placeholder="example.myshopify.com" class="Polaris-TextField__Input">
|
34
|
+
<div class="Polaris-TextField__Backdrop"></div>
|
35
|
+
</div>
|
36
|
+
<% if flash[:error] %>
|
37
|
+
<div class="Polaris-InlineError"><%= flash[:error] %></div>
|
38
|
+
<% end %>
|
39
|
+
<button type="submit" class="Polaris-Button Polaris-Button--primary Polaris-Button--sizeLarge">
|
40
|
+
<span class="Polaris-Button__Content"><span>Install app</span>
|
41
|
+
</button>
|
42
|
+
<% end %>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
</div>
|
120
49
|
</main>
|
121
|
-
|
122
50
|
</body>
|
123
51
|
</html>
|
@@ -49,7 +49,7 @@
|
|
49
49
|
</div>
|
50
50
|
</div>
|
51
51
|
<div class="Polaris-Stack__Item">
|
52
|
-
<div class="Polaris-Stack Polaris-Stack--distributionTrailing">
|
52
|
+
<div class="Polaris-Stack Polaris-Stack--distributionTrailing Polaris-Stack--distributionTrailingCustomSpacing">
|
53
53
|
<div class="Polaris-Stack__Item">
|
54
54
|
<button type="button" class="Polaris-Button Polaris-Button--primary" id="TriggerAllowCookiesPrompt">
|
55
55
|
<span class="Polaris-Button__Content"><span><%= I18n.t('request_storage_access_action') %></span></span>
|
@@ -5,6 +5,7 @@
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
6
6
|
<base target="_top">
|
7
7
|
<title>Redirecting…</title>
|
8
|
+
<%= render 'shopify_app/partials/card_styles' %>
|
8
9
|
<%= render 'shopify_app/partials/layout_styles' %>
|
9
10
|
<%= render 'shopify_app/partials/typography_styles' %>
|
10
11
|
<%= render 'shopify_app/partials/button_styles' %>
|
@@ -25,26 +26,30 @@
|
|
25
26
|
<div class="Polaris-Layout__Section">
|
26
27
|
<div class="Polaris-Stack Polaris-Stack--vertical">
|
27
28
|
<div class="Polaris-Stack__Item">
|
28
|
-
<div class="Polaris-
|
29
|
-
<div class="Polaris-
|
30
|
-
<div class="Polaris-
|
31
|
-
<div class="Polaris-
|
32
|
-
<div class="Polaris-
|
33
|
-
<
|
34
|
-
|
35
|
-
|
29
|
+
<div class="Polaris-Card">
|
30
|
+
<div class="Polaris-Card__Section">
|
31
|
+
<div class="Polaris-EmptyState">
|
32
|
+
<div class="Polaris-EmptyState__Section">
|
33
|
+
<div class="Polaris-EmptyState__DetailsContainer">
|
34
|
+
<div class="Polaris-EmptyState__Details">
|
35
|
+
<div class="Polaris-TextContainer">
|
36
|
+
<h1 class="Polaris-DisplayText Polaris-DisplayText--sizeSmall"><%= I18n.t('top_level_interaction_heading', app: ShopifyApp.configuration.application_name) %></h1>
|
37
|
+
<div class="Polaris-EmptyState__Content">
|
38
|
+
<p><%= I18n.t('top_level_interaction_body', app: ShopifyApp.configuration.application_name) %></p>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
<div class="Polaris-EmptyState__Actions">
|
42
|
+
<div class="Polaris-Stack Polaris-Stack--alignmentCenter">
|
43
|
+
<div class="Polaris-Stack__Item"><button type="button" id="TopLevelInteractionButton" class="Polaris-Button Polaris-Button--primary Polaris-Button--sizeLarge"><span class="Polaris-Button__Content"><span class="Polaris-Button__Icon"></span><span><%= I18n.t('top_level_interaction_action') %></span></span></button></div>
|
44
|
+
</div>
|
45
|
+
</div>
|
36
46
|
</div>
|
37
47
|
</div>
|
38
|
-
<div class="Polaris-
|
39
|
-
|
40
|
-
<div class="Polaris-Stack__Item"><button type="button" id="TopLevelInteractionButton" class="Polaris-Button Polaris-Button--primary Polaris-Button--sizeLarge"><span class="Polaris-Button__Content"><span class="Polaris-Button__Icon"></span><span><%= I18n.t('top_level_interaction_action') %></span></span></button></div>
|
41
|
-
</div>
|
48
|
+
<div class="Polaris-EmptyState__ImageContainer">
|
49
|
+
<%= image_tag 'storage_access.svg', role: "presentation", alt: "", class: "Polaris-EmptyState__Image" %>
|
42
50
|
</div>
|
43
51
|
</div>
|
44
52
|
</div>
|
45
|
-
<div class="Polaris-EmptyState__ImageContainer">
|
46
|
-
<%= image_tag 'storage_access.svg', role: "presentation", alt: "", class: "Polaris-EmptyState__Image" %>
|
47
|
-
</div>
|
48
53
|
</div>
|
49
54
|
</div>
|
50
55
|
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
6
|
+
<base target="_top">
|
7
|
+
<title>Redirecting…</title>
|
8
|
+
<%= javascript_include_tag('shopify_app/post_redirect', crossorigin: 'anonymous', integrity: true) %>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<%= form_tag '/auth/shopify', id: 'redirect-form' %>
|
12
|
+
</body>
|
13
|
+
</html>
|
data/config/locales/de.yml
CHANGED
@@ -4,19 +4,19 @@ de:
|
|
4
4
|
could_not_log_in: Shopify Store Login fehlgeschlagen
|
5
5
|
invalid_shop_url: Ungültige Shop-Domain
|
6
6
|
enable_cookies_heading: Cookies von %{app} aktivieren
|
7
|
-
enable_cookies_body:
|
8
|
-
|
9
|
-
enable_cookies_footer: Mithilfe von Cookies kann die App
|
10
|
-
|
11
|
-
Sie laufen nach 30 Tagen ab.
|
7
|
+
enable_cookies_body: Du musst Cookies in diesem Browser manuell aktivieren, um %{app}
|
8
|
+
in Shopify verwenden zu können.
|
9
|
+
enable_cookies_footer: Mithilfe von Cookies kann die App dich authentifizieren,
|
10
|
+
indem deine Einstellungen und personenbezogenen Daten vorübergehend gespeichert
|
11
|
+
werden. Sie laufen nach 30 Tagen ab.
|
12
12
|
enable_cookies_action: Cookies aktivieren
|
13
|
-
top_level_interaction_heading:
|
14
|
-
top_level_interaction_body:
|
15
|
-
auf Cookies bitten, bevor Shopify sie für
|
13
|
+
top_level_interaction_heading: Dein Browser muss %{app} authentifizieren
|
14
|
+
top_level_interaction_body: Dein Browser verlangt, dass Apps wie %{app} dich um
|
15
|
+
Zugriff auf Cookies bitten, bevor Shopify sie für dich öffnen kann.
|
16
16
|
top_level_interaction_action: Weiter
|
17
17
|
request_storage_access_heading: "%{app} braucht Zugriff auf Cookies"
|
18
|
-
request_storage_access_body: Damit kann die App
|
19
|
-
Einstellungen und personenbezogenen Daten vorübergehend gespeichert werden.
|
20
|
-
|
18
|
+
request_storage_access_body: Damit kann die App dich authentifizieren, indem deine
|
19
|
+
Einstellungen und personenbezogenen Daten vorübergehend gespeichert werden. Klicke
|
20
|
+
auf "Weiter" und erlaube Cookies, um die App zu verwenden.
|
21
21
|
request_storage_access_footer: Cookies laufen nach 30 Tagen ab.
|
22
22
|
request_storage_access_action: Weiter
|
data/config/locales/nl.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
nl:
|
3
3
|
logged_out: Je bent afgemeld
|
4
|
-
could_not_log_in: Kon niet
|
4
|
+
could_not_log_in: Kon niet inloggen bij Shopify-winkel
|
5
5
|
invalid_shop_url: Ongeldig winkeldomein
|
6
6
|
enable_cookies_heading: Schakel cookies in van %{app}
|
7
7
|
enable_cookies_body: Je moet cookies in deze browser handmatig inschakelen om %{app}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
vi:
|
3
|
+
logged_out: Đã đăng xuất thành công
|
4
|
+
could_not_log_in: Không thể đăng nhập vào cửa hàng trên Shopify
|
5
|
+
invalid_shop_url: Miền cửa hàng không hợp lệ
|
6
|
+
enable_cookies_heading: Bật cookie từ %{app}
|
7
|
+
enable_cookies_body: Bạn phải bật cookie trong trình duyệt này theo cách thủ công
|
8
|
+
để sử dụng %{app} trong Shopify.
|
9
|
+
enable_cookies_footer: Cookie cho phép ứng dụng xác thực bạn bằng cách tạm thời
|
10
|
+
lưu trữ tùy chọn và thông tin cá nhân của bạn. Những thông tin này sẽ hết hạn
|
11
|
+
sau 30 ngày.
|
12
|
+
enable_cookies_action: Bật cookie
|
13
|
+
top_level_interaction_heading: Trình duyệt của bạn cần xác thực %{app}
|
14
|
+
top_level_interaction_body: Trình duyệt của bạn cần các ứng dụng như %{app} để yêu
|
15
|
+
cầu quyền truy cập vào cookie thì Shopify mới có thể mở giúp bạn.
|
16
|
+
top_level_interaction_action: Tiếp tục
|
17
|
+
request_storage_access_heading: "%{app} cần quyền truy cập cookie"
|
18
|
+
request_storage_access_body: Nhờ vậy, ứng dụng có thể xác thực bạn bằng cách tạm
|
19
|
+
thời lưu trữ thông tin cá nhân của bạn. Nhấp vào tiếp tục và cho phép cookie sử
|
20
|
+
dụng ứng dụng.
|
21
|
+
request_storage_access_footer: Cookie sẽ hết hạn sau 30 ngày.
|
22
|
+
request_storage_access_action: Tiếp tục
|
data/config/locales/zh-CN.yml
CHANGED
@@ -8,7 +8,7 @@ zh-CN:
|
|
8
8
|
enable_cookies_footer: Cookie 使此应用能够通过暂时存储您的偏好设置和个人信息来验证您的身份。这些信息将在 30 天后过期。
|
9
9
|
enable_cookies_action: 启用 Cookie
|
10
10
|
top_level_interaction_heading: 您的浏览器需要对 %{app} 进行验证
|
11
|
-
top_level_interaction_body: 您的浏览器要求类似 %{app}
|
11
|
+
top_level_interaction_body: 您的浏览器要求类似 %{app} 的应用向您申请访问 Cookie,之后 Shopify 才能为您打开它。
|
12
12
|
top_level_interaction_action: 继续
|
13
13
|
request_storage_access_heading: "%{app} 需要访问 Cookie"
|
14
14
|
request_storage_access_body: 这使此应用能够通过暂时存储您的个人信息来验证您的身份。单击继续并启用 Cookie 以使用此应用。
|
data/docs/Quickstart.md
CHANGED
@@ -1,93 +1,31 @@
|
|
1
|
-
Quickstart
|
2
|
-
==========
|
1
|
+
# Quickstart
|
3
2
|
|
4
|
-
|
5
|
-
This guide assumes you have Ruby, Rails and PostgreSQL installed on your computer already; if you haven't done that already start with [this guide.](https://guides.rubyonrails.org/v5.0/getting_started.html#installing-rails)
|
3
|
+
This guide assumes you have completed the steps to create a new Rails app using the Shopify App gem found in the [*Usage*](/README.md#usage) section of the project's [*README*](/README.md).
|
6
4
|
|
7
|
-
|
8
|
-
--------------------------------
|
5
|
+
#### Table of contents
|
9
6
|
|
10
|
-
|
7
|
+
[Make your app available to the internet](#make-your-app-available-to-the-internet)
|
11
8
|
|
12
|
-
|
13
|
-
$ rails new test-app --database=postgresql
|
14
|
-
$ cd test-app
|
15
|
-
$ git init
|
16
|
-
$ git add .
|
17
|
-
$ git commit -m 'new rails app'
|
18
|
-
```
|
19
|
-
|
20
|
-
2. Create a new Heroku app
|
21
|
-
--------------------------
|
22
|
-
|
23
|
-
The next step is to create a new Heroku app to host your application. If you haven't got a Heroku account yet, create a free account [here](https://www.heroku.com/).
|
24
|
-
|
25
|
-
Head to the Heroku dashboard and create a new app, or run the following commands with the [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#download-and-install) installed, substituting `name` for the name of your own app:
|
26
|
-
|
27
|
-
CLI:
|
28
|
-
```sh
|
29
|
-
$ heroku create name
|
30
|
-
```
|
31
|
-
|
32
|
-
3. Create a new App in the Shopify Partner dashboard
|
33
|
-
-----------------------------------------
|
34
|
-
* Create a Shopify app in the [Partners dashboard](https://partner.shopify.com). For this tutorial, you can choose either a public or custom app, but you can [learn about App Types here.](https://help.shopify.com/en/manual/apps/app-types)
|
35
|
-
[https://app.shopify.com/services/partners/api_clients](https://app.shopify.com/services/partners/api_clients)
|
36
|
-
* Set the callback url to `https://<appname>.herokuapp.com/`
|
37
|
-
* Choose an embedded app
|
38
|
-
* Set the app's `redirect_uri` to `https://<appname>.herokuapp.com/auth/shopify/callback`
|
39
|
-
|
40
|
-
4. Add ShopifyApp to Gemfile
|
41
|
-
----------------------------
|
42
|
-
|
43
|
-
Run this command to add the `shopify_app` Gem to your app:
|
9
|
+
[Use Shopify App Bridge to embed your app in the Shopify Admin](#use-shopify-app-bridge-to-embed-your-app-in-the-shopify-admin)
|
44
10
|
|
45
|
-
|
46
|
-
$ bundle add shopify_app
|
47
|
-
```
|
11
|
+
## Make your app available to the internet
|
48
12
|
|
49
|
-
|
13
|
+
Your local app needs to be accessible from the public Internet in order to install it on a Shopify store, to use the [App Proxy Controller](/lib/generators/shopify_app/app_proxy_controller/templates/app_proxy_controller.rb) or receive [webhooks](/docs/shopify_app/webhooks.md).
|
50
14
|
|
51
|
-
|
52
|
-
-------------------------------
|
15
|
+
Use a tunneling service like [ngrok](https://ngrok.com/), [Beeceptor](https://beeceptor.com/), [Mockbin](http://mockbin.org/), or [Hookbin](https://hookbin.com/) to make your development environment accessible to the internet.
|
53
16
|
|
54
|
-
|
17
|
+
For example with [ngrok](https://ngrok.com/), run this command to set up a tunnel proxy to Rails' default port:
|
55
18
|
|
56
19
|
```sh
|
57
|
-
|
58
|
-
$ rails generate shopify_app
|
59
|
-
$ git add .
|
60
|
-
$ git commit -m 'generated shopify app'
|
20
|
+
ngrok http 3000
|
61
21
|
```
|
62
22
|
|
63
|
-
|
64
|
-
README for further details on how to set this up.
|
65
|
-
|
66
|
-
6. Deploy your app
|
67
|
-
---------
|
68
|
-
|
69
|
-
Once you've generated your app, push it into your Heroku environment to see it up and running:
|
70
|
-
```sh
|
71
|
-
$ git push heroku
|
72
|
-
$ heroku run rake db:migrate
|
73
|
-
```
|
74
|
-
|
75
|
-
7. Install the App!
|
76
|
-
-------------------
|
77
|
-
|
78
|
-
Ensure you have created a [development store](https://help.shopify.com/en/api/getting-started/making-your-first-request#create-a-development-store) using the Shopify Partner Dashboard. If you don't already have one, [create one by following these instructions](https://help.shopify.com/en/api/getting-started/making-your-first-request#create-a-development-store).
|
79
|
-
|
80
|
-
##### Note: The following step will cause your store to become `transfer-disabled.` Read more about store transfer and why it's important [here](https://help.shopify.com/en/api/guides/store-transfers#transfer-disabled-stores). This is an irreversible change, so be sure you don't plan to transfer this store to a merchant.
|
81
|
-
|
82
|
-
Install the app onto your new development store using the Partner Dashboard. Log in to your account, visit the apps page, click the app you created earlier, and looking for the `Test your app` instructions where you can select a store to install your app on.
|
83
|
-
|
84
|
-
![Installing an app on the partners dashboard dropdown](/docs/install-on-dev-shop.png)
|
23
|
+
See the [*Embed the app in Shopify*](https://shopify.dev/tutorials/build-rails-react-app-that-uses-app-bridge-authentication#embed-the-app-in-shopify) section of [*Build a Shopify app with Rails, React, and App Bridge*](https://shopify.dev/tutorials/build-rails-react-app-that-uses-app-bridge-authentication) to learn more.
|
85
24
|
|
86
|
-
|
25
|
+
## Use Shopify App Bridge to embed your app in the Shopify Admin
|
87
26
|
|
88
|
-
|
27
|
+
A basic example of using [*Shopify App Bridge*](https://shopify.dev/tools/app-bridge) is included in the install generator. An instance Shopify App Bridge is automatically initialized in [shopify_app.js](https://github.com/Shopify/shopify_app/blob/master/lib/generators/shopify_app/install/templates/shopify_app.js).
|
89
28
|
|
90
|
-
|
91
|
-
-------------------
|
29
|
+
The [flash_messages.js](https://github.com/Shopify/shopify_app/blob/master/lib/generators/shopify_app/install/templates/flash_messages.js) file converts Rails [flash messages](https://api.rubyonrails.org/classes/ActionDispatch/Flash.html) to App Bridge Toast actions automatically. By default, this library is included via [unpkg in the embedded_app layout](https://github.com/Shopify/shopify_app/blob/master/lib/generators/shopify_app/install/templates/embedded_app.html.erb#L27).
|
92
30
|
|
93
|
-
|
31
|
+
For more advanced uses it is recommended to [install App Bridge via npm or yarn](https://help.shopify.com/en/api/embedded-apps/app-bridge/getting-started#set-up-shopify-app-bridge-in-your-app).
|
data/docs/Releasing.md
CHANGED
@@ -1,18 +1,21 @@
|
|
1
|
-
Releasing ShopifyApp
|
1
|
+
# Releasing ShopifyApp
|
2
2
|
|
3
|
-
1.
|
3
|
+
1. Make the code changes in a separate PR that doesn't modify the version.
|
4
|
+
1. After that is merged, check the Semantic Versioning page for info on how to version the new release: http://semver.org
|
4
5
|
1. Create a pull request with the following changes:
|
5
6
|
- Update the version of ShopifyApp in lib/shopify_app/version.rb
|
6
7
|
- Update the version of shopify_app in package.json
|
8
|
+
- Run `bundle` to update `Gemfile.lock`
|
7
9
|
- Add a CHANGELOG entry for the new release with the date
|
8
10
|
- Change the title of the PR to something like: "Packaging for release X.Y.Z"
|
9
11
|
1. Merge your pull request
|
10
12
|
1. Checkout and pull from master so you have the latest version of the shopify_app
|
11
13
|
1. Tag the HEAD with the version
|
12
|
-
```bash
|
13
|
-
$ git tag -f vX.Y.Z && git push --tags --force
|
14
|
-
```
|
14
|
+
```bash
|
15
|
+
$ git tag -f vX.Y.Z && git push --tags --force
|
16
|
+
```
|
17
|
+
1. Check that Create Release workflow successfully runs
|
15
18
|
1. Use Shipit to build and push the gem
|
16
19
|
|
17
|
-
If you see an error like 'You need to create the vX.Y.X tag first', clear
|
20
|
+
If you see an error like 'You need to create the vX.Y.X tag first', clear git
|
18
21
|
cache in Shipit settings
|