@spree/seller-dashboard 6.0.0-rc.7 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,12 +2,11 @@
2
2
 
3
3
  The React seller panel for [Spree Commerce](https://spreecommerce.org) marketplaces — the surface a seller signs into to manage their products, orders and fulfillments. Built on the [Seller API](https://spreecommerce.org/docs/api-reference/seller-api/introduction) via `@spree/seller-sdk`.
4
4
 
5
- > **Beta.** Published under the `beta` tag while Spree 6.0 is in beta, and
6
- > promoted to `latest` at 6.0 GA. Install it explicitly:
7
- >
8
- > ```bash
9
- > npm install @spree/seller-dashboard@beta
10
- > ```
5
+ ```bash
6
+ npm install @spree/seller-dashboard
7
+ ```
8
+
9
+ `@spree/seller-dashboard` is released with Spree and carries its version: `@spree/seller-dashboard@6.0.x` works with Spree 6.0.x.
11
10
 
12
11
  It shares its primitives with `@spree/dashboard` — components from `@spree/dashboard-ui`, framework pieces from `@spree/dashboard-core` — so the two panels stay visually and behaviourally consistent.
13
12
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spree/seller-dashboard",
3
- "version": "6.0.0-rc.7",
3
+ "version": "6.0.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Spree marketplace seller panel — the seller-facing counterpart to the admin dashboard.",
@@ -44,8 +44,8 @@
44
44
  "@tanstack/virtual-file-routes": "^1.162.0",
45
45
  "lucide-react": "^1.60.0",
46
46
  "zod": "^4.6.7",
47
- "@spree/core": "^6.0.0-rc.7",
48
- "@spree/seller-sdk": "6.0.0-rc.7"
47
+ "@spree/core": "^6.0.1",
48
+ "@spree/seller-sdk": "6.0.1"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@tanstack/react-query": "^5.104.5",
@@ -55,17 +55,17 @@
55
55
  "react-dom": "^19.3.1",
56
56
  "react-hook-form": "^7.90.0",
57
57
  "react-i18next": "^17.1.0",
58
- "@spree/admin-sdk": "^6.0.0-rc.7",
59
- "@spree/dashboard-core": "^6.0.0-rc.7",
60
- "@spree/dashboard-ui": "^6.0.0-rc.7"
58
+ "@spree/admin-sdk": "^6.0.1",
59
+ "@spree/dashboard-core": "^6.0.1",
60
+ "@spree/dashboard-ui": "^6.0.1"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@biomejs/biome": "^2.4.14",
64
64
  "@tanstack/react-query": "^5.104.5",
65
65
  "@tanstack/react-router": "^1.170.45",
66
66
  "@types/node": "^26.6.5",
67
- "@types/react": "^19.2.2",
68
- "@types/react-dom": "^19.2.1",
67
+ "@types/react": "^19.2.14",
68
+ "@types/react-dom": "^19.2.3",
69
69
  "@vitejs/plugin-react": "^6.0.1",
70
70
  "i18next": "^26.5.3",
71
71
  "react": "^19.3.1",
@@ -75,9 +75,9 @@
75
75
  "tsup": "^9.0.0",
76
76
  "typescript": "~7.0.2",
77
77
  "vite": "^8.3.4",
78
- "@spree/admin-sdk": "6.0.0-rc.7",
79
- "@spree/dashboard-core": "6.0.0-rc.7",
80
- "@spree/dashboard-ui": "6.0.0-rc.7"
78
+ "@spree/admin-sdk": "6.0.1",
79
+ "@spree/dashboard-core": "6.0.1",
80
+ "@spree/dashboard-ui": "6.0.1"
81
81
  },
82
82
  "scripts": {
83
83
  "build": "pnpm generate:routes && tsup",
@@ -1,17 +1,4 @@
1
1
  {
2
- "accept_invitation": {
3
- "failed": "تعذَّر قبول هذه الدعوة. ربما انتهت صلاحيتها أو كانت كلمة المرور خاطئة.",
4
- "first_name": "الاسم الأول",
5
- "invalid_link": "هذا الرابط ينقصه الرمز. افتح الرابط من رسالة الدعوة.",
6
- "last_name": "اسم العائلة",
7
- "not_found": "لم تعد هذه الدعوة صالحة. اطلب ممن دعاك إرسال دعوة جديدة.",
8
- "password": "كلمة المرور",
9
- "password_confirmation": "تأكيد كلمة المرور",
10
- "submit": "قبول الدعوة",
11
- "submitting": "جارٍ القبول…",
12
- "subtitle": "تمت دعوتك بالبريد {{email}}. عيّن كلمة مرور لإتمام التسجيل.",
13
- "title": "انضم إلى الفريق"
14
- },
15
2
  "account": {
16
3
  "avatar": "الصورة",
17
4
  "avatar_help": "تظهر بجوار اسمك في جميع أنحاء اللوحة. الصور المربعة تبدو أفضل.",
@@ -1,17 +1,4 @@
1
1
  {
2
- "accept_invitation": {
3
- "failed": "Diese Einladung konnte nicht angenommen werden. Möglicherweise ist sie abgelaufen oder das Passwort war falsch.",
4
- "first_name": "Vorname",
5
- "invalid_link": "Diesem Link fehlt sein Token. Öffnen Sie den Link aus Ihrer Einladungs-E-Mail.",
6
- "last_name": "Nachname",
7
- "not_found": "Diese Einladung ist nicht mehr gültig. Bitten Sie die Person, die Sie eingeladen hat, um eine neue.",
8
- "password": "Passwort",
9
- "password_confirmation": "Passwort bestätigen",
10
- "submit": "Einladung annehmen",
11
- "submitting": "Wird angenommen…",
12
- "subtitle": "Sie wurden als {{email}} eingeladen. Legen Sie ein Passwort fest, um abzuschließen.",
13
- "title": "Team beitreten"
14
- },
15
2
  "account": {
16
3
  "avatar": "Foto",
17
4
  "avatar_help": "Wird im gesamten Panel neben Ihrem Namen angezeigt. Quadratische Bilder sehen am besten aus.",
@@ -1,17 +1,4 @@
1
1
  {
2
- "accept_invitation": {
3
- "failed": "That invitation could not be accepted. It may have expired, or the password was wrong.",
4
- "first_name": "First name",
5
- "invalid_link": "This link is missing its token. Open the link from your invitation email.",
6
- "last_name": "Last name",
7
- "not_found": "This invitation is no longer valid. Ask whoever invited you to send a new one.",
8
- "password": "Password",
9
- "password_confirmation": "Confirm password",
10
- "submit": "Accept invitation",
11
- "submitting": "Accepting…",
12
- "subtitle": "You were invited as {{email}}. Set a password to finish.",
13
- "title": "Join the team"
14
- },
15
2
  "account": {
16
3
  "avatar": "Photo",
17
4
  "avatar_help": "Shown next to your name across the panel. Square images look best.",
@@ -1,17 +1,4 @@
1
1
  {
2
- "accept_invitation": {
3
- "failed": "Cette invitation n’a pas pu être acceptée. Elle a peut-être expiré, ou le mot de passe était incorrect.",
4
- "first_name": "Prénom",
5
- "invalid_link": "Il manque le jeton dans ce lien. Ouvrez le lien depuis votre e-mail d’invitation.",
6
- "last_name": "Nom",
7
- "not_found": "Cette invitation n’est plus valable. Demandez à la personne qui vous a invité de vous en envoyer une nouvelle.",
8
- "password": "Mot de passe",
9
- "password_confirmation": "Confirmer le mot de passe",
10
- "submit": "Accepter l’invitation",
11
- "submitting": "Acceptation…",
12
- "subtitle": "Vous avez été invité en tant que {{email}}. Choisissez un mot de passe pour terminer.",
13
- "title": "Rejoindre l’équipe"
14
- },
15
2
  "account": {
16
3
  "avatar": "Photo",
17
4
  "avatar_help": "Affichée à côté de votre nom dans tout le panneau. Les images carrées sont recommandées.",
@@ -0,0 +1,851 @@
1
+ {
2
+ "account": {
3
+ "avatar": "写真",
4
+ "avatar_help": "パネル内であなたの名前の横に表示されます。正方形の画像がきれいに表示されます。",
5
+ "email": "メールアドレス",
6
+ "first_name": "名",
7
+ "language": "言語",
8
+ "last_name": "姓",
9
+ "load_failed_title": "プロフィールを読み込めませんでした",
10
+ "save_failed": "プロフィールを保存できませんでした",
11
+ "saved": "プロフィールを更新しました",
12
+ "saving": "保存中…",
13
+ "subtitle": "個人情報とパネルの表示言語を管理します。",
14
+ "title": "プロフィール"
15
+ },
16
+ "admin": {
17
+ "actions": {
18
+ "actions_menu": "操作",
19
+ "cancel": "キャンセル",
20
+ "delete": "削除",
21
+ "edit": "編集",
22
+ "save": "保存",
23
+ "saving": "保存中…"
24
+ },
25
+ "common": {
26
+ "loading": "読み込み中…",
27
+ "no_results": "結果がありません"
28
+ },
29
+ "components": {
30
+ "export_button": {
31
+ "all": {
32
+ "description": "フィルターを無視して、すべてのレコードをエクスポートします。"
33
+ }
34
+ }
35
+ },
36
+ "fields": {
37
+ "tax_identifier": {
38
+ "kind": {
39
+ "help": "どの登録かを示します。登録されている検証ロジックと一致する必要があるので、つづりに注意してください。",
40
+ "label": "種類",
41
+ "required": "登録の種類を選ぶか入力"
42
+ },
43
+ "value": {
44
+ "label": "番号",
45
+ "placeholder": "DE123456789",
46
+ "required": "登録番号を入れてください"
47
+ }
48
+ }
49
+ },
50
+ "orders": {
51
+ "detail": {
52
+ "cancel": {
53
+ "description": "理由とメモは注文に記録され、支払いは精算されます。",
54
+ "keep_order": "注文を残す",
55
+ "no_reason": "理由なし",
56
+ "note_label": "メモ",
57
+ "note_placeholder": "このメモはスタッフだけが見られます",
58
+ "notify_customer": "顧客にメールを送る",
59
+ "reason_label": "理由",
60
+ "refund_payments": "顧客に返金する",
61
+ "refund_payments_help": "受け取り済みの代金は返金します。受け取っていないオーソリはどちらの場合も解放します。"
62
+ },
63
+ "fulfillments": {
64
+ "add_tracking_title": "追跡番号を追加",
65
+ "carrier_auto": "自動で判定",
66
+ "carrier_label": "運送会社",
67
+ "carrier_search": "運送会社を検索",
68
+ "delivery_method": "配送方法",
69
+ "edit_description": "このフルフィルメントの出荷元と配送方法を変更します。",
70
+ "edit_title": "フルフィルメントを編集",
71
+ "edit_tracking_title": "追跡番号を編集",
72
+ "move_and_requote": "移して再見積もり",
73
+ "no_rates": "このフルフィルメントで見積もられた配送方法はありません。",
74
+ "rates_pending_origin": "新しい出荷元を保存すると、提供される配送方法を確認できます。",
75
+ "ships_from": "出荷元",
76
+ "tracking_description": "運送会社の追跡番号か、追跡リンク全体です。",
77
+ "upload_label_cost": "送料",
78
+ "upload_label_description": "ほかで購入したラベルを記録し、荷物にファイル・追跡番号・費用を残します。",
79
+ "upload_label_file": "ラベルのファイル",
80
+ "upload_label_title": "ラベルをアップロード"
81
+ },
82
+ "section_customer_note": "特記事項",
83
+ "section_internal_note": "社内メモ"
84
+ },
85
+ "fulfill": {
86
+ "include_item": "{{name}}を出荷",
87
+ "quantity_for": "{{name}}の出荷数量",
88
+ "of_units": "/ {{count}}",
89
+ "empty": "このフルフィルメントには、処理できる品目がありません。",
90
+ "tracking_label": "追跡番号",
91
+ "tracking_placeholder": "追跡番号かリンク",
92
+ "notify_customer": "顧客に発送の通知を送る",
93
+ "partial_hint": "選んだ品目は、今出荷する新しいフルフィルメントに移ります。残りはこちらに未処理のまま残ります。",
94
+ "units_selected": "出荷する数",
95
+ "submit": "品目を処理"
96
+ }
97
+ },
98
+ "tax_identifiers": {
99
+ "add_cta": "登録番号を追加",
100
+ "add_title": "税の登録番号を追加",
101
+ "checked_prefix": "確認日",
102
+ "delete_confirm": {
103
+ "message": "{{value}} を削除します。すでに受けた注文は、請求したときの番号のままです。",
104
+ "title": "この登録番号を削除しますか?"
105
+ },
106
+ "dialog_description": "請求書に載る VAT 番号や事業者番号です。これにより EU の B2B のリバースチャージが可能になります。",
107
+ "edit_title": "税の登録番号を編集",
108
+ "empty": "登録された税の登録番号はありません",
109
+ "kinds": {
110
+ "au_abn": "オーストラリア事業者番号(ABN)",
111
+ "ch_vat": "スイスの VAT",
112
+ "eu_vat": "EU の VAT",
113
+ "gb_vat": "英国の VAT",
114
+ "us_ein": "米国の EIN"
115
+ },
116
+ "messages": {
117
+ "created": "登録番号を追加しました",
118
+ "deleted": "登録番号を削除しました",
119
+ "updated": "登録番号を更新しました",
120
+ "validation_failed": "番号を確かめられませんでした",
121
+ "validation_requested": "登録機関で番号を確かめています"
122
+ },
123
+ "not_validatable": "この種類を確かめる登録機関がないので、入力したとおりに記録します。",
124
+ "select_kind": "種類を選ぶ",
125
+ "title": "税の登録番号",
126
+ "validate_action": "登録機関で確かめる",
127
+ "validation_status": {
128
+ "not_checked": "未確認",
129
+ "pending": "確認中",
130
+ "unavailable": "登録機関を利用できません",
131
+ "unsupported": "確認できません",
132
+ "unverified": "無効",
133
+ "verified": "確認済み"
134
+ }
135
+ },
136
+ "pages": {
137
+ "orders": {
138
+ "detail": {
139
+ "returns": {
140
+ "receive_title": "返品された品目を受け取る",
141
+ "received_quantity": "受け取り済み",
142
+ "resellable": "再販できる",
143
+ "actions": {
144
+ "receive": "品目を受け取る",
145
+ "refund": "返金",
146
+ "complete": "返品を完了"
147
+ },
148
+ "refund_title": "返品を返金",
149
+ "complete_title": "返品を完了",
150
+ "nothing_owed": "この返品で返す金額はないので、お金は戻りません。完了すると返品を閉じます。",
151
+ "refund_amount": "金額",
152
+ "refund_includes_tax": "全額には {{tax}} の税が含まれます。少ない額にすると、税も同じ割合で返します。",
153
+ "refund_method": "返金先",
154
+ "refund_methods": {
155
+ "original_payment": "元の支払い方法",
156
+ "store_credit": "ストアクレジット"
157
+ },
158
+ "reason": "理由",
159
+ "location": "返品先",
160
+ "location_default": "既定の返品ロケーション",
161
+ "location_no_returns": "{{name}}(返品を受け付けません)",
162
+ "memo": "メモ",
163
+ "create_title": "新しい返品"
164
+ },
165
+ "claims": {
166
+ "resolve_title": "クレームを解決",
167
+ "resolution": "解決の方法",
168
+ "resolutions": {
169
+ "refund": "返金",
170
+ "replacement": "交換品",
171
+ "refund_and_replacement": "返金と交換品"
172
+ },
173
+ "refund_amount": "返金額",
174
+ "replacement_items": "交換品を送る対象",
175
+ "actions": {
176
+ "resolve": "解決",
177
+ "create": "新しいクレーム"
178
+ },
179
+ "create_title": "新しいクレーム"
180
+ },
181
+ "dialogs": {
182
+ "cancel_title": "注文をキャンセルしますか?"
183
+ },
184
+ "actions": {
185
+ "cancel": "注文をキャンセル"
186
+ }
187
+ }
188
+ }
189
+ },
190
+ "settings_nav": {
191
+ "descriptions": {
192
+ "delivery_methods": "商品をお客様に届ける方法",
193
+ "package_types": "注文の梱包に使う箱・カートン・コンテナ",
194
+ "policies": "利用規約・プライバシー・返品・配送の文書",
195
+ "stock_locations": "在庫を置く倉庫と受け取り場所",
196
+ "team": "このセラーにアクセスできる人"
197
+ }
198
+ },
199
+ "settings_page": {
200
+ "description": "配送、法的文書、チームを管理します。"
201
+ }
202
+ },
203
+ "app": {
204
+ "name": "セラーパネル"
205
+ },
206
+ "common": {
207
+ "apply": "適用",
208
+ "cancel": "キャンセル",
209
+ "delete": "削除",
210
+ "error": "問題が起きました。",
211
+ "loading": "読み込み中…",
212
+ "no_results": "結果がありません",
213
+ "remove": "外す",
214
+ "retry": "もう一度試す",
215
+ "save": "保存",
216
+ "saving": "保存中…",
217
+ "actions": "操作",
218
+ "edit": "編集"
219
+ },
220
+ "delivery_methods": {
221
+ "add": "配送方法を追加",
222
+ "columns": {
223
+ "name": "名前",
224
+ "owner": "所有者",
225
+ "visibility": "表示"
226
+ },
227
+ "conditions": {
228
+ "add": "条件を追加",
229
+ "description": "条件がない場合、この方法は発送可能なすべての注文で選択肢に表示されます。",
230
+ "remove": "条件を削除"
231
+ },
232
+ "delete_confirm": {
233
+ "title": "配送方法を削除しますか?",
234
+ "message": "{{name}} を削除します。この方法で発送済みの注文の記録は残ります。"
235
+ },
236
+ "description": "注文をお客様に届ける方法と、お客様が支払う送料です。",
237
+ "empty": {
238
+ "title": "配送方法はまだありません",
239
+ "description": "配送方法を追加するか、このマーケットプレイスがセラーと共有している方法を使ってください。"
240
+ },
241
+ "fields": {
242
+ "admin_name": "社内用の名前",
243
+ "calculator": "価格",
244
+ "delivery_profile": "商品の種類",
245
+ "delivery_zone": "配送先",
246
+ "name": "名前",
247
+ "storefront_visible": "チェックアウトに表示"
248
+ },
249
+ "messages": {
250
+ "deleted": "配送方法を削除しました",
251
+ "saved": "配送方法を保存しました"
252
+ },
253
+ "owner": {
254
+ "marketplace": "マーケットプレイス",
255
+ "mine": "自分の方法"
256
+ },
257
+ "search_placeholder": "名前で検索…",
258
+ "sections": {
259
+ "conditions": "この方法が適用される条件",
260
+ "goods": "配送する商品",
261
+ "price": "料金"
262
+ },
263
+ "sheet": {
264
+ "new_title": "新しい配送方法",
265
+ "description": "お客様がチェックアウトで選ぶので、お客様に説明するときの言葉で名前を付けてください。"
266
+ },
267
+ "title": "配送方法",
268
+ "visibility": {
269
+ "hidden": "非表示",
270
+ "storefront": "ストア"
271
+ },
272
+ "zone": {
273
+ "everywhere": "この種類の商品が届くすべての地域"
274
+ }
275
+ },
276
+ "earnings": {
277
+ "balance": {
278
+ "converted": "{{currency}} で得た収益を、あなたの通貨で支払います",
279
+ "earned": "収益",
280
+ "empty": "注文が発送されると、その収益がここに表示されます。",
281
+ "load_error": "残高を読み込めませんでした。",
282
+ "owed": "未払いの収益({{currency}})",
283
+ "paid": "支払い済み",
284
+ "payable": "支払予定額",
285
+ "pending": "輸送中",
286
+ "title": "残高"
287
+ },
288
+ "columns": {
289
+ "date": "日付",
290
+ "order": "注文",
291
+ "kind": "種類",
292
+ "status": "状態",
293
+ "amount": "金額"
294
+ },
295
+ "kinds": {
296
+ "earning": "売上",
297
+ "refund_reversal": "返金"
298
+ },
299
+ "search_placeholder": "参照で検索",
300
+ "statuses": {
301
+ "pending": "保留中",
302
+ "processing": "処理中",
303
+ "completed": "完了",
304
+ "failed": "失敗",
305
+ "unresolved": "確認が必要"
306
+ },
307
+ "subtitle": "売上による収益と、マーケットプレイスとの精算状況です。",
308
+ "title": "収益",
309
+ "transfers": {
310
+ "title": "収益",
311
+ "empty": "収益はまだありません。"
312
+ }
313
+ },
314
+ "forgot_password": {
315
+ "back_to_login": "サインインに戻る",
316
+ "email": "メールアドレス",
317
+ "failed": "リクエストを送信できませんでした。しばらくしてからもう一度お試しください。",
318
+ "sent_subtitle": "そのアドレスがセラーアカウントのものであれば、再設定用のリンクをお送りしました。リンクの有効期限は短いのでご注意ください。",
319
+ "sent_title": "メールをご確認ください",
320
+ "submit": "再設定リンクを送る",
321
+ "submitting": "送信中…",
322
+ "subtitle": "メールアドレスを入力すると、新しいパスワードを設定するためのリンクをお送りします。",
323
+ "title": "パスワードをお忘れですか?"
324
+ },
325
+ "home": {
326
+ "products": "商品",
327
+ "selling_no": "商品はまだ販売されていません。",
328
+ "selling_title": "販売",
329
+ "selling_yes": "商品は販売中です。",
330
+ "setup_cta": "設定を続ける",
331
+ "setup_description": "{{total}} 件中 {{done}} 件完了 — 販売を始めるには、残りを完了してください。",
332
+ "setup_title": "設定を完了する",
333
+ "status": "状態",
334
+ "subtitle": "このマーケットプレイスでのあなたの状況です。",
335
+ "team": "チームメンバー",
336
+ "title": "こんにちは、{{name}} さん"
337
+ },
338
+ "login": {
339
+ "email": "メールアドレス",
340
+ "failed": "そのメールアドレスとパスワードに一致するセラーアカウントがありません。",
341
+ "forgot_password": "パスワードをお忘れですか?",
342
+ "no_seller": "このアカウントは、このマーケットプレイスのセラーを運営していません。",
343
+ "password": "パスワード",
344
+ "submit": "ログイン",
345
+ "submitting": "ログイン中…",
346
+ "subtitle": "ストア、チーム、支払いを管理します。",
347
+ "title": "セラーパネルにログイン"
348
+ },
349
+ "nav": {
350
+ "home": "ホーム",
351
+ "legal": "法的文書",
352
+ "onboarding": "設定",
353
+ "orders": "注文",
354
+ "policies": "ポリシー",
355
+ "products": "商品",
356
+ "profile": "プロフィール",
357
+ "settings": "設定",
358
+ "sign_out": "ログアウト",
359
+ "team": "チーム",
360
+ "delivery_methods": "配送方法",
361
+ "package_types": "こん包タイプ",
362
+ "earnings": "収益",
363
+ "payouts": "支払い"
364
+ },
365
+ "onboarding": {
366
+ "accept_terms": "規約に同意する",
367
+ "awaiting_review": "マーケットプレイスの審査を待っています。",
368
+ "connect_payout_account": "受け取り方法を設定する",
369
+ "payout_account_rejected": "支払いプロバイダーにお問い合わせください",
370
+ "awaiting_payout_provider": "支払いプロバイダーが情報を確認し終わるのを待っています。",
371
+ "confirm": "確認",
372
+ "document_help": "PDF または書類の画像。",
373
+ "document_label": "書類",
374
+ "done": "完了しました。",
375
+ "go": "移動",
376
+ "note_placeholder": "マーケットプレイスに伝えたいこと(任意)",
377
+ "optional": "任意",
378
+ "progress_count": "{{total}} 件中 {{done}} 件が完了",
379
+ "progress_title": "進捗",
380
+ "read_terms": "規約を読む",
381
+ "ready": "必要な項目はすべて完了しました。",
382
+ "remaining_one": "提出するまでに、あと {{count}} 件の作業があります",
383
+ "remaining_other": "提出するまでに、あと {{count}} 件の作業があります",
384
+ "status": {
385
+ "complete": "完了",
386
+ "pending": "審査中",
387
+ "rejected": "再確認が必要"
388
+ },
389
+ "submit": "審査を申請",
390
+ "submit_document": "審査を申請",
391
+ "submitted": "審査に提出済み",
392
+ "submitted_requirement": "提出済み",
393
+ "submitting": "送信中…",
394
+ "subtitle": "販売を始める前に、このマーケットプレイスが求めている項目です。",
395
+ "terms_accepted": "規約に同意済み",
396
+ "title": "設定",
397
+ "under_review": "マーケットプレイスが申請を審査しています。進展があればメールでお知らせします。"
398
+ },
399
+ "orders": {
400
+ "address_edit": {
401
+ "billing_title": "請求先住所を編集",
402
+ "shipping_title": "お届け先住所を編集"
403
+ },
404
+ "billing_address": "請求先住所",
405
+ "columns": {
406
+ "fulfillment": "フルフィルメント",
407
+ "number": "注文",
408
+ "payment": "支払い",
409
+ "placed": "受注",
410
+ "quantity": "数量",
411
+ "total": "合計"
412
+ },
413
+ "customer": {
414
+ "title": "顧客"
415
+ },
416
+ "customer_note": "顧客のメモ",
417
+ "earnings": {
418
+ "title": "収益",
419
+ "payout": "支払い",
420
+ "view_payout": "支払いを見る",
421
+ "not_settled": "まだ支払っていません"
422
+ },
423
+ "empty": "注文はまだありません。お客様が購入すると、ここに表示されます。",
424
+ "fulfill": "処理済みにする",
425
+ "fulfillment_statuses": {
426
+ "backorder": "入荷待ち",
427
+ "canceled": "キャンセル済み",
428
+ "delivered": "配達済み",
429
+ "fulfilled": "処理済み",
430
+ "partial": "一部",
431
+ "unfulfilled": "未処理"
432
+ },
433
+ "fulfillments": {
434
+ "add_delivery": "追跡番号を追加",
435
+ "add_tracking": "追跡番号を追加",
436
+ "cancel": "荷物をキャンセル",
437
+ "cancel_message": "商品は在庫に戻り、配送業者への依頼は取り消されます。",
438
+ "cancel_title": "この荷物をキャンセルしますか?",
439
+ "carrier_status_available_for_pickup": "受け取り可能",
440
+ "carrier_status_delivered": "配達済み",
441
+ "carrier_status_failure": "配達できませんでした",
442
+ "carrier_status_in_transit": "輸送中",
443
+ "carrier_status_out_for_delivery": "配達中",
444
+ "carrier_status_pending": "運送会社の受け取り待ち",
445
+ "carrier_status_pre_transit": "ラベル作成済み",
446
+ "carrier_status_return_to_sender": "差出人へ返送中",
447
+ "carrier_status_unknown": "状態不明",
448
+ "confirm_delete_delivery": "この追跡番号を削除しますか?",
449
+ "confirm_delete_label": "このラベルを削除しますか?ファイルは削除され、再印刷できなくなります。",
450
+ "confirm_split": "すぐに反映されます。",
451
+ "delete_label": "ラベルを削除",
452
+ "empty": "この注文で発送するものはありません。",
453
+ "free": "無料",
454
+ "label_cost": "費用 {{amount}}",
455
+ "label_title": "配送ラベル",
456
+ "label_uploaded": "アップロード済み",
457
+ "packing_slip_title": "納品書 — 注文 {{number}}",
458
+ "print_label": "ラベルを印刷",
459
+ "print_packing_slip": "納品書を印刷",
460
+ "quoted_after_review": "確認後に見積もり",
461
+ "ship_to": "お届け先",
462
+ "ships_from_label": "出荷元",
463
+ "split": "分割",
464
+ "split_description": "この荷物の中身の一部を、別の荷物に移します。",
465
+ "split_item": "品目",
466
+ "split_quantity": "移す数量",
467
+ "split_title": "荷物を分ける",
468
+ "split_would_empty": "すべて移すと、この荷物が空になります。",
469
+ "splitting": "分割中…",
470
+ "title": "フルフィルメント",
471
+ "upload_label": "ラベルをアップロード"
472
+ },
473
+ "items": "品目",
474
+ "not_found": "注文が見つかりませんでした。",
475
+ "payment": {
476
+ "title": "支払い",
477
+ "share_help": "このカートでお客様が支払った金額のうち、あなたの取り分です。",
478
+ "authorized": "オーソリ済み",
479
+ "captured": "確定済み",
480
+ "refunded": "返金済み",
481
+ "refundable": "返金可能"
482
+ },
483
+ "payment_statuses": {
484
+ "none": "未払い",
485
+ "authorized": "オーソリ済み",
486
+ "partially_paid": "一部支払い済み",
487
+ "paid": "支払い済み",
488
+ "partially_refunded": "一部返金済み",
489
+ "refunded": "返金済み",
490
+ "overcharged": "過剰請求",
491
+ "voided": "無効"
492
+ },
493
+ "post_sale": {
494
+ "approve": "承認",
495
+ "cancel": "キャンセル",
496
+ "claims": {
497
+ "cancel_message": "お客様には、手続きを進めないことが通知されます。",
498
+ "cancel_title": "この申し立てをキャンセルしますか?",
499
+ "create": "新しいクレーム",
500
+ "deny": "却下",
501
+ "deny_message": "お客様には、申し立てが認められなかったことが通知されます。",
502
+ "deny_title": "この申し立てを却下しますか?",
503
+ "empty": "この注文で報告された問題はありません。",
504
+ "resolve": "解決",
505
+ "title": "クレーム"
506
+ },
507
+ "exchanges": {
508
+ "title": "交換",
509
+ "receive": "受け取る",
510
+ "fulfill": "交換品を発送",
511
+ "balance_due_confirm": "交換品の価格が返品された商品を上回っています。発送すると、差額が未払い残高として注文に加わります。自動では請求されません。",
512
+ "price_difference": "差額: {{amount}}",
513
+ "cancel_title": "この交換をキャンセルしますか?",
514
+ "cancel_message": "お客様には、手続きを進めないことが通知されます。"
515
+ },
516
+ "reason": "理由",
517
+ "returns": {
518
+ "cancel_message": "お客様には、手続きを進めないことが通知されます。",
519
+ "cancel_title": "この返品をキャンセルしますか?",
520
+ "create": "新しい返品",
521
+ "empty": "この注文から返品された商品はありません。",
522
+ "not_resellable": "再販できない",
523
+ "partially_received": "{{quantity}} 点中 {{received}} 点を受け取り済み",
524
+ "receive": "受け取る",
525
+ "refund": "返金",
526
+ "refund_total": "返金合計: {{amount}}",
527
+ "refunded": "返金済み: {{amount}}",
528
+ "refunded_of": "返金済み: {{total}} 中 {{amount}}",
529
+ "title": "返品"
530
+ },
531
+ "statuses": {
532
+ "requested": "申請中",
533
+ "approved": "承認済み",
534
+ "received": "受け取り済み",
535
+ "refunded": "返金済み",
536
+ "fulfilled": "処理済み",
537
+ "open": "受付中",
538
+ "resolved": "解決済み",
539
+ "denied": "却下",
540
+ "canceled": "キャンセル済み"
541
+ }
542
+ },
543
+ "search_placeholder": "注文番号で検索…",
544
+ "shipping_address": "配送先",
545
+ "ships_from": "{{name}} から発送",
546
+ "summary": {
547
+ "adjustments": "調整",
548
+ "cancel_note": "キャンセルのメモ",
549
+ "cancel_reason": "キャンセルの理由",
550
+ "canceled_at": "キャンセル日時",
551
+ "commission_fee": "マーケットプレイス手数料",
552
+ "commission_tax": "マーケットプレイス手数料の税",
553
+ "commission_total": "マーケットプレイス手数料の合計",
554
+ "completed_at": "完了日時",
555
+ "created_at": "作成日時",
556
+ "currency": "通貨",
557
+ "item_total": "品目",
558
+ "outstanding_balance": "未払いの残高",
559
+ "payment_total": "支払い合計",
560
+ "promotions": "プロモーション",
561
+ "shipping": "配送",
562
+ "subtotal": "小計",
563
+ "tax_additional": "税(外税)",
564
+ "tax_included": "税(内税)",
565
+ "tax_total": "税",
566
+ "title": "概要",
567
+ "total": "合計"
568
+ },
569
+ "title": "注文",
570
+ "tracking_label": "追跡番号"
571
+ },
572
+ "payouts": {
573
+ "columns": {
574
+ "date": "日付",
575
+ "status": "状態",
576
+ "earnings": "収益",
577
+ "reference": "参照番号",
578
+ "amount": "金額"
579
+ },
580
+ "detail": {
581
+ "covers_empty": "この支払いに含まれる収益はありません。",
582
+ "covers_error": "この支払いに含まれる収益を読み込めませんでした。",
583
+ "covers_one": "収益 {{count}} 件分",
584
+ "covers_other": "収益 {{count}} 件分",
585
+ "period": "期間",
586
+ "settlement": "支払い"
587
+ },
588
+ "empty": "支払いはまだありません。",
589
+ "not_found": "この支払いが見つかりませんでした。",
590
+ "search_placeholder": "参照で検索",
591
+ "subtitle": "マーケットプレイスから送金された金額と、送金予定の金額です。",
592
+ "title": "支払い"
593
+ },
594
+ "policies": {
595
+ "add": "ポリシーを追加",
596
+ "columns": {
597
+ "name": "名前",
598
+ "updated": "更新日時"
599
+ },
600
+ "delete_confirm": {
601
+ "title": "ポリシーを削除しますか?",
602
+ "message": "{{name}} を削除します。マーケットプレイスが必須としている場合、設定の未完了項目に再び表示されます。"
603
+ },
604
+ "description": "ストアページでお客様に表示される法的文書です。",
605
+ "empty": {
606
+ "title": "ポリシーはまだありません",
607
+ "description": "このマーケットプレイスが求めている文書を公開してください。"
608
+ },
609
+ "fields": {
610
+ "name": "名前",
611
+ "body": "内容"
612
+ },
613
+ "messages": {
614
+ "deleted": "ポリシーを削除しました",
615
+ "saved": "ポリシーを保存しました"
616
+ },
617
+ "required": {
618
+ "title": "求められている文書",
619
+ "description": "このマーケットプレイスでは、承認の前にこれらのポリシーが必要です。",
620
+ "write": "作成する"
621
+ },
622
+ "search_placeholder": "名前で検索…",
623
+ "sheet": {
624
+ "new_title": "新しいポリシー",
625
+ "description": "お客様はストアページでこれを読みます。"
626
+ },
627
+ "title": "ポリシー"
628
+ },
629
+ "products": {
630
+ "add": "商品を追加",
631
+ "add_images": "画像を追加",
632
+ "add_variant": "バリアントを追加",
633
+ "archive": "アーカイブ",
634
+ "archive_confirm_description": "販売が停止され、出品中の一覧から外れます。",
635
+ "archive_confirm_title": "この商品をアーカイブしますか?",
636
+ "bulk": {
637
+ "delete_confirm_description": "{n} 件をカタログから削除します。お客様には表示されなくなります。",
638
+ "delete_confirm_title": "選択した商品を削除しますか?",
639
+ "delete_failed": "商品を削除できませんでした。",
640
+ "deleted": "{n} 件の商品を削除しました",
641
+ "set_status_action": "ステータスを設定",
642
+ "skipped_one": "{{count}} 件は変更されませんでした。{{message}}",
643
+ "skipped_other": "{{count}} 件は変更されませんでした。{{message}}",
644
+ "skipped_refused": "マーケットプレイスが変更を許可しませんでした。理由は各商品を開いて確認してください。",
645
+ "skipped_submit": "提出できるのは、下書きの商品と、マーケットプレイスから修正を求められた商品だけです。",
646
+ "status_dialog_description": "作業中の商品を非公開にするか、完全にアーカイブします。販売を始めるかどうかはマーケットプレイスが決めるので、代わりに審査を申請してください。",
647
+ "status_dialog_title": "ステータスを設定",
648
+ "status_update_failed": "商品を更新できませんでした。",
649
+ "status_updated": "{n} 件の商品を更新しました",
650
+ "submit_confirm_description": "マーケットプレイスが {n} 件の商品を審査し、販売するかどうかを決めます。",
651
+ "submit_confirm_title": "選択した商品の審査を申請しますか?",
652
+ "submit_failed": "商品を提出できませんでした。",
653
+ "submitted": "{n} 件の商品の審査を申請しました"
654
+ },
655
+ "columns": {
656
+ "name": "商品",
657
+ "price": "価格",
658
+ "status": "状態"
659
+ },
660
+ "custom_fields": "商品の詳細",
661
+ "details": "詳細",
662
+ "empty": "商品はまだありません。追加して販売を始めましょう。",
663
+ "fields": {
664
+ "alt": "代替テキスト",
665
+ "categories": "カテゴリ",
666
+ "categories_placeholder": "カテゴリを検索…",
667
+ "collections": "コレクション",
668
+ "collections_placeholder": "コレクションを検索…",
669
+ "country_of_origin": "原産国",
670
+ "country_of_origin_placeholder": "例: JP",
671
+ "description": "説明",
672
+ "hs_code": "HS コード",
673
+ "hs_code_placeholder": "例: 9405.20",
674
+ "meta_description": "メタディスクリプション",
675
+ "meta_keywords": "メタキーワード",
676
+ "meta_title": "ページタイトル",
677
+ "name": "名前",
678
+ "option": "オプション",
679
+ "option_name": "オプション",
680
+ "option_value": "値",
681
+ "price": "価格",
682
+ "price_in": "価格({{currency}})",
683
+ "price_placeholder": "空欄の場合は現在の価格のままです",
684
+ "product_type": "商品タイプ",
685
+ "product_type_placeholder": "種類を選択",
686
+ "sku": "SKU",
687
+ "slug": "URL ハンドル",
688
+ "status": "状態",
689
+ "stock": "在庫",
690
+ "weight": "重量"
691
+ },
692
+ "media": "メディア",
693
+ "media_remove_confirm_description": "保存すると商品から外れます。",
694
+ "media_remove_confirm_title": "この画像を外しますか?",
695
+ "new_title": "新しい商品",
696
+ "not_found": "商品が見つかりませんでした。",
697
+ "organization": "分類",
698
+ "rejection_reason": "理由: {{reason}}",
699
+ "saved": "商品を保存しました",
700
+ "search_placeholder": "名前で検索…",
701
+ "seo": "検索エンジンでの表示",
702
+ "shipping": "配送と通関",
703
+ "status_help": {
704
+ "active": "販売中で、お客様に表示されています。",
705
+ "archived": "販売を停止し、出品中の一覧から外れています。",
706
+ "draft": "あなただけが見られます。準備ができたら、マーケットプレイスに審査を申請してください。",
707
+ "proposed": "マーケットプレイスの審査を待っています。変更は引き続きできます。",
708
+ "rejected": "マーケットプレイスから修正を求められています。編集してから、もう一度申請してください。"
709
+ },
710
+ "status_updated": "ステータスを更新しました",
711
+ "statuses": {
712
+ "active": "有効",
713
+ "archived": "アーカイブ済み",
714
+ "draft": "下書き",
715
+ "proposed": "審査中",
716
+ "rejected": "修正が必要"
717
+ },
718
+ "submit_for_review": "審査を申請",
719
+ "take_down": "非公開にする",
720
+ "take_down_confirm_description": "お客様には表示されなくなります。後でもう一度申請できます。",
721
+ "take_down_confirm_title": "この商品を非公開にしますか?",
722
+ "title": "商品",
723
+ "uploading": "{{count}} 件のファイルをアップロード中…",
724
+ "uploading_plural": "{{count}} 件のファイルをアップロード中…",
725
+ "variant_remove_confirm_description": "保存すると商品から外れます。",
726
+ "variant_remove_confirm_title": "このバリアントを削除しますか?",
727
+ "variants": "バリアント",
728
+ "variants_empty": "この商品は上記の価格で、1 つの商品として販売されます。サイズやカラーなどの選択肢で販売するには、バリアントを追加してください。",
729
+ "digital_files_review_notice": "ファイルを追加または差し替えると、この商品は再審査になり、マーケットプレイスが再び承認するまで販売が停止されます。"
730
+ },
731
+ "profile": {
732
+ "about": "紹介",
733
+ "add_address": "住所を追加",
734
+ "address_filled": "追加済み",
735
+ "address_missing": "未登録",
736
+ "address_not_provided": "住所はまだありません。",
737
+ "at_a_glance": "概要",
738
+ "billing_address": "請求先住所",
739
+ "billing_email": "請求用のメールアドレス",
740
+ "business_details": "事業者情報",
741
+ "contact_email": "連絡先メールアドレス",
742
+ "edit": "編集",
743
+ "edit_title": "プロフィールを編集",
744
+ "joined": "登録日",
745
+ "legal_name": "正式名称",
746
+ "minimum_payout": "最低支払額",
747
+ "name": "名前",
748
+ "no_about": "説明はまだ書かれていません。",
749
+ "not_provided": "未登録",
750
+ "on_holiday_notice": "休業モードがオンのため、商品は表示されますが購入できません。",
751
+ "operator_managed": "マーケットプレイスが設定",
752
+ "payout_schedule": "支払いのスケジュール",
753
+ "products_count": "商品",
754
+ "registration_number": "登録番号",
755
+ "returns_address": "返品先の住所",
756
+ "save": "変更を保存",
757
+ "saved": "プロフィールを保存しました",
758
+ "saving": "保存中…",
759
+ "section_contact": "連絡先",
760
+ "section_settlement": "支払いと税",
761
+ "section_standing": "状態",
762
+ "select_tax_identifier_kind": "登録の種類を選択または入力",
763
+ "status_help": {
764
+ "approved": "承認済みです。このマーケットプレイスで販売できます。",
765
+ "canceled": "このセラーアカウントは閉鎖されています。",
766
+ "invited": "招待されています。設定を完了して申請してください。",
767
+ "onboarding": "チェックリストを進めてから、審査を申請してください。",
768
+ "pending": "マーケットプレイスはまだ申請の処理を始めていません。",
769
+ "ready_for_review": "マーケットプレイスが申請を審査しています。",
770
+ "rejected": "申請は承認されませんでした。詳しくはマーケットプレイスにお問い合わせください。",
771
+ "suspended": "販売は一時停止中です。詳しくはマーケットプレイスにお問い合わせください。"
772
+ },
773
+ "subtitle": "ストアでのあなたの紹介と、マーケットプレイスからの連絡先です。",
774
+ "tax_identifier_kind": "登録の種類",
775
+ "tax_identifier_kinds": {
776
+ "au_abn": "オーストラリア事業者番号(ABN)",
777
+ "ch_vat": "スイスの VAT",
778
+ "eu_vat": "EU の VAT",
779
+ "gb_vat": "英国の VAT",
780
+ "us_ein": "米国の EIN"
781
+ },
782
+ "tax_remittance": "税の納付者",
783
+ "team_count": "チームメンバー",
784
+ "vat_number": "VAT 番号",
785
+ "vat_status": {
786
+ "pending": "この番号を確認しています。",
787
+ "unavailable": "登録機関に接続できませんでした。後でもう一度確認します。",
788
+ "unsupported": "この番号は入力されたとおりに記録されます。自動では確認できません。",
789
+ "unverified": "この番号を確認できませんでした。"
790
+ }
791
+ },
792
+ "reset_password": {
793
+ "failed": "このリンクは使えませんでした。期限が切れているか、パスワードが受け付けられなかった可能性があります。",
794
+ "invalid_link": "このリンクにはトークンがありません。再設定メールのリンクから開いてください。",
795
+ "mismatch": "2 つのパスワードが一致していません。",
796
+ "password": "新しいパスワード",
797
+ "password_confirmation": "新しいパスワード(確認)",
798
+ "request_new_link": "新しいリンクをリクエスト",
799
+ "submit": "パスワードを変更",
800
+ "submitting": "保存中…",
801
+ "subtitle": "新しいパスワードを設定して、ログインを完了してください。",
802
+ "title": "新しいパスワードを決める"
803
+ },
804
+ "seller_picker": {
805
+ "status": "状態",
806
+ "subtitle": "複数のセラーを運営しています。管理するセラーを選んでください。",
807
+ "title": "セラーを選択"
808
+ },
809
+ "seller_switcher": {
810
+ "label": "セラーを切り替え"
811
+ },
812
+ "team": {
813
+ "actions": {
814
+ "copy_link": "招待のリンクをコピー",
815
+ "remove": "削除",
816
+ "resend": "招待を再送",
817
+ "revoke": "取り消す"
818
+ },
819
+ "confirm": {
820
+ "remove_message": "{{name}} はすぐにこのセラーにアクセスできなくなります。",
821
+ "remove_title": "メンバーを削除",
822
+ "revoke_message": "{{email}} への招待は使えなくなります。",
823
+ "revoke_title": "招待を取り消す"
824
+ },
825
+ "empty": "チームにはまだ誰もいません",
826
+ "empty_description": "同僚を招待すると、承諾後にここに表示されます。",
827
+ "invitations_section": "保留中の招待",
828
+ "invite_cta": "メンバーを招待",
829
+ "invite_description": "このセラーに参加するためのリンクがメールで届きます。",
830
+ "invite_email": "メールアドレス",
831
+ "invite_email_placeholder": "colleague@example.com",
832
+ "invite_sending": "送信中…",
833
+ "invite_submit": "招待を送る",
834
+ "invite_title": "同僚を招待",
835
+ "members_section": "メンバー",
836
+ "messages": {
837
+ "invited": "招待を送りました",
838
+ "link_copied": "招待のリンクをコピーしました",
839
+ "removed": "メンバーを削除しました",
840
+ "resent": "招待をもう一度送りました",
841
+ "revoked": "招待を取り消しました"
842
+ },
843
+ "subtitle": "このセラーにログインして管理できる人です。",
844
+ "table": {
845
+ "email": "メールアドレス",
846
+ "expires": "有効期限",
847
+ "member": "メンバー"
848
+ },
849
+ "title": "チーム"
850
+ }
851
+ }
@@ -1,17 +1,4 @@
1
1
  {
2
- "accept_invitation": {
3
- "failed": "Nie udało się przyjąć tego zaproszenia. Mogło wygasnąć lub hasło było nieprawidłowe.",
4
- "first_name": "Imię",
5
- "invalid_link": "W tym linku brakuje tokenu. Otwórz link z wiadomości z zaproszeniem.",
6
- "last_name": "Nazwisko",
7
- "not_found": "To zaproszenie jest już nieważne. Poproś osobę, która Cię zaprosiła, o nowe.",
8
- "password": "Hasło",
9
- "password_confirmation": "Potwierdź hasło",
10
- "submit": "Przyjmij zaproszenie",
11
- "submitting": "Przyjmowanie…",
12
- "subtitle": "Zaproszenie otrzymał adres {{email}}. Ustaw hasło, aby zakończyć.",
13
- "title": "Dołącz do zespołu"
14
- },
15
2
  "account": {
16
3
  "avatar": "Zdjęcie",
17
4
  "avatar_help": "Wyświetlane obok Twojego imienia w całym panelu. Najlepiej wyglądają zdjęcia kwadratowe.",
@@ -1,17 +1,4 @@
1
1
  {
2
- "accept_invitation": {
3
- "failed": "无法接受该邀请。邀请可能已过期,或密码有误。",
4
- "first_name": "名字",
5
- "invalid_link": "此链接缺少令牌。请从邀请邮件中打开链接。",
6
- "last_name": "姓氏",
7
- "not_found": "此邀请已失效。请让邀请你的人重新发送一份。",
8
- "password": "密码",
9
- "password_confirmation": "确认密码",
10
- "submit": "接受邀请",
11
- "submitting": "正在接受…",
12
- "subtitle": "你以 {{email}} 的身份受邀。设置密码即可完成。",
13
- "title": "加入团队"
14
- },
15
2
  "account": {
16
3
  "avatar": "照片",
17
4
  "avatar_help": "在面板中显示在您的姓名旁边。方形图片效果最佳。",
@@ -1,26 +1,14 @@
1
- import { useAuth } from '@spree/dashboard-core'
2
- import { Button, Field, FieldError, FieldGroup, FieldLabel, Input } from '@spree/dashboard-ui'
3
- import { useQuery } from '@tanstack/react-query'
1
+ import { InvitationAcceptance } from '@spree/dashboard-core'
4
2
  import { useNavigate } from '@tanstack/react-router'
5
- import { useState } from 'react'
6
- import { useForm } from 'react-hook-form'
7
- import { useTranslation } from 'react-i18next'
8
3
  import { sellerClient } from '../api-client'
9
- import { CenteredMessage } from '../components/centered-message'
10
-
11
- interface AcceptValues {
12
- password: string
13
- password_confirmation: string
14
- first_name: string
15
- last_name: string
16
- }
17
4
 
18
5
  /**
19
6
  * Joining a seller's team from the emailed link.
20
7
  *
21
- * The invitation id and token in the URL are the whole credential — nobody is
22
- * signed in yet. Accepting returns a seller session, so the new member lands
23
- * in the panel rather than being bounced to a login form.
8
+ * The screens are the framework's, shared with the operator's dashboard; what
9
+ * is the panel's own is which API answers the lookup and where an accepted
10
+ * member lands. That is the seller they joined: the layout under that route
11
+ * loads the member's permissions for it.
24
12
  */
25
13
  export function AcceptInvitationPage({
26
14
  invitationId,
@@ -29,98 +17,31 @@ export function AcceptInvitationPage({
29
17
  invitationId: string
30
18
  token?: string
31
19
  }) {
32
- const { t } = useTranslation()
33
- const { acceptInvitation } = useAuth()
34
20
  const navigate = useNavigate()
35
- const [error, setError] = useState<string | null>(null)
36
-
37
- const {
38
- data: invitation,
39
- isLoading,
40
- error: lookupError,
41
- } = useQuery({
42
- queryKey: ['seller', 'invitation', invitationId],
43
- queryFn: () => sellerClient().auth.lookupInvitation(invitationId, token ?? ''),
44
- enabled: Boolean(token),
45
- retry: false,
46
- })
47
-
48
- const form = useForm<AcceptValues>({
49
- defaultValues: { password: '', password_confirmation: '', first_name: '', last_name: '' },
50
- })
51
-
52
- if (!token) return <CenteredMessage>{t('accept_invitation.invalid_link')}</CenteredMessage>
53
- if (isLoading) return <CenteredMessage>{t('common.loading')}</CenteredMessage>
54
- if (lookupError || !invitation) {
55
- return <CenteredMessage>{t('accept_invitation.not_found')}</CenteredMessage>
56
- }
57
-
58
- async function onSubmit(values: AcceptValues) {
59
- setError(null)
60
- try {
61
- await acceptInvitation(invitationId, token ?? '', values)
62
- // The index route decides where to go from there — it already knows how
63
- // to skip the picker for someone who runs exactly one seller. Without
64
- // this the form simply sits there after a successful accept, and the
65
- // obvious next move is to submit again, against an invitation that has
66
- // now been consumed.
67
- navigate({ to: '/', replace: true })
68
- } catch {
69
- setError(t('accept_invitation.failed'))
70
- }
71
- }
72
-
73
- const { errors, isSubmitting } = form.formState
74
21
 
75
22
  return (
76
23
  <div className="flex min-h-screen items-center justify-center p-6">
77
- <div className="w-full max-w-sm">
78
- <h1 className="font-medium text-xl">{t('accept_invitation.title')}</h1>
79
- <p className="mt-1 mb-6 text-muted-foreground text-sm">
80
- {t('accept_invitation.subtitle', { email: invitation.email })}
81
- </p>
82
-
83
- <form onSubmit={form.handleSubmit(onSubmit)}>
84
- <FieldGroup>
85
- <Field>
86
- <FieldLabel htmlFor="first_name">{t('accept_invitation.first_name')}</FieldLabel>
87
- <Input id="first_name" {...form.register('first_name')} />
88
- </Field>
89
-
90
- <Field>
91
- <FieldLabel htmlFor="last_name">{t('accept_invitation.last_name')}</FieldLabel>
92
- <Input id="last_name" {...form.register('last_name')} />
93
- </Field>
94
-
95
- <Field>
96
- <FieldLabel htmlFor="password">{t('accept_invitation.password')}</FieldLabel>
97
- <Input
98
- id="password"
99
- type="password"
100
- aria-invalid={!!errors.password || undefined}
101
- {...form.register('password', { required: true })}
102
- />
103
- <FieldError errors={[errors.password]} />
104
- </Field>
105
-
106
- <Field>
107
- <FieldLabel htmlFor="password_confirmation">
108
- {t('accept_invitation.password_confirmation')}
109
- </FieldLabel>
110
- <Input
111
- id="password_confirmation"
112
- type="password"
113
- {...form.register('password_confirmation')}
114
- />
115
- </Field>
116
-
117
- {error && <p className="text-destructive text-sm">{error}</p>}
118
-
119
- <Button type="submit" disabled={isSubmitting}>
120
- {isSubmitting ? t('accept_invitation.submitting') : t('accept_invitation.submit')}
121
- </Button>
122
- </FieldGroup>
123
- </form>
24
+ <div className="flex w-full max-w-sm flex-col gap-6">
25
+ <InvitationAcceptance
26
+ invitationId={invitationId}
27
+ token={token}
28
+ lookup={async (id, token) => {
29
+ const invitation = await sellerClient().auth.lookupInvitation(id, token)
30
+ // Carried by the lookup alone; the team listings leave it out.
31
+ return {
32
+ ...invitation,
33
+ invitee_exists: invitation.invitee_exists ?? false,
34
+ target: invitation.seller,
35
+ }
36
+ }}
37
+ onAccepted={(invitation) =>
38
+ navigate({
39
+ to: '/$sellerId',
40
+ params: { sellerId: invitation.target.id },
41
+ replace: true,
42
+ })
43
+ }
44
+ />
124
45
  </div>
125
46
  </div>
126
47
  )
@@ -24,15 +24,13 @@ import {
24
24
  Progress,
25
25
  ScrollArea,
26
26
  StatusBadge as SharedStatusBadge,
27
+ StepIcon,
27
28
  Textarea,
28
29
  toastManager,
29
30
  } from '@spree/dashboard-ui'
30
31
  import {
31
- CheckCircle2Icon,
32
32
  ChevronRightIcon,
33
33
  CircleAlertIcon,
34
- CircleIcon,
35
- ClockIcon,
36
34
  ExternalLinkIcon,
37
35
  XCircleIcon,
38
36
  } from '@spree/dashboard-ui/icons'
@@ -517,17 +515,14 @@ function panelRoute(kind: string): string | undefined {
517
515
  }
518
516
  }
519
517
 
518
+ // The operator's setup checklist icons, plus a submission sent back.
520
519
  function StatusIcon({ status }: { status: string }) {
521
- if (status === 'complete') {
522
- return <CheckCircle2Icon className="size-5 shrink-0 text-success" />
523
- }
524
- if (status === 'pending') {
525
- return <ClockIcon className="size-5 shrink-0 text-warning" />
526
- }
520
+ if (status === 'complete') return <StepIcon status="done" className="size-5" />
521
+ if (status === 'pending') return <StepIcon status="in_progress" className="size-5" />
527
522
  if (status === 'rejected') {
528
523
  return <XCircleIcon className="size-5 shrink-0 text-destructive" />
529
524
  }
530
- return <CircleIcon className="size-5 shrink-0 text-muted-foreground" />
525
+ return <StepIcon status="todo" className="size-5" />
531
526
  }
532
527
 
533
528
  function StatusBadge({ status }: { status: string }) {