// static/store/js/profile.js /** * Store profile management page logic * Edit store business profile and contact information */ const storeProfileLog = window.LogConfig.loggers.storeProfile || window.LogConfig.createLogger('storeProfile', false); storeProfileLog.info('Loading...'); function storeProfile() { storeProfileLog.info('storeProfile() called'); return { // Inherit base layout state ...data(), // Set page identifier currentPage: 'profile', // Loading states loading: true, error: '', saving: false, // Profile data profile: null, // Edit form form: { name: '', contact_email: '', contact_phone: '', website: '', business_address: '', tax_number: '', description: '' }, // Form validation errors: {}, // Track if form has changes hasChanges: false, async init() { // Load i18n translations await I18n.loadModule('tenancy'); storeProfileLog.info('Profile init() called'); // Guard against multiple initialization if (window._storeProfileInitialized) { storeProfileLog.warn('Already initialized, skipping'); return; } window._storeProfileInitialized = true; // IMPORTANT: Call parent init first to set storeCode from URL const parentInit = data().init; if (parentInit) { await parentInit.call(this); } try { await this.loadProfile(); } catch (error) { storeProfileLog.error('Init failed:', error); this.error = 'Failed to initialize profile page'; } storeProfileLog.info('Profile initialization complete'); }, /** * Load store profile */ async loadProfile() { this.loading = true; this.error = ''; try { const response = await apiClient.get(`/store/profile`); this.profile = response; this.form = { name: response.name || '', contact_email: response.contact_email || '', contact_phone: response.contact_phone || '', website: response.website || '', business_address: response.business_address || '', tax_number: response.tax_number || '', description: response.description || '' }; this.hasChanges = false; storeProfileLog.info('Loaded profile:', this.profile.store_code); } catch (error) { storeProfileLog.error('Failed to load profile:', error); this.error = error.message || 'Failed to load profile'; } finally { this.loading = false; } }, /** * Mark form as changed */ markChanged() { this.hasChanges = true; }, /** * Validate form */ validateForm() { this.errors = {}; if (!this.form.name?.trim()) { this.errors.name = 'Business name is required'; } if (this.form.contact_email && !this.isValidEmail(this.form.contact_email)) { this.errors.contact_email = 'Invalid email address'; } if (this.form.website && !this.isValidUrl(this.form.website)) { this.errors.website = 'Invalid URL format'; } return Object.keys(this.errors).length === 0; }, /** * Check if email is valid */ isValidEmail(email) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); }, /** * Check if URL is valid */ isValidUrl(url) { try { new URL(url); return true; } catch { return url.match(/^(https?:\/\/)?[\w-]+(\.[\w-]+)+/) !== null; } }, /** * Save profile changes */ async saveProfile() { if (!this.validateForm()) { Utils.showToast(I18n.t('tenancy.messages.please_fix_the_errors_before_saving'), 'error'); return; } this.saving = true; try { await apiClient.put(`/store/profile`, this.form); Utils.showToast(I18n.t('tenancy.messages.profile_updated_successfully'), 'success'); storeProfileLog.info('Profile updated'); this.hasChanges = false; await this.loadProfile(); } catch (error) { storeProfileLog.error('Failed to save profile:', error); Utils.showToast(error.message || 'Failed to save profile', 'error'); } finally { this.saving = false; } }, /** * Reset form to original values */ resetForm() { if (this.profile) { this.form = { name: this.profile.name || '', contact_email: this.profile.contact_email || '', contact_phone: this.profile.contact_phone || '', website: this.profile.website || '', business_address: this.profile.business_address || '', tax_number: this.profile.tax_number || '', description: this.profile.description || '' }; } this.hasChanges = false; this.errors = {}; } }; }